Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » EMF databinding Recipe
EMF databinding Recipe [message #420232] Mon, 23 June 2008 21:08 Go to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
Hi,

I have a view implementation that displays my EMF model via this mechanism:

treeViewer.setContentProvider(new
AdapterFactoryContentProvider(adapterFactory));
treeViewer.setLabelProvider(new DecoratingLabelProvider(new
AdapterFactoryLabelProvider(adapterFactory),
new ADElementLabelDecorator()));

However, now we would like to make use of the EMF databinding capability
in 2.4 so I have tried to replace the above code with something similar to
the one suggested in the EMF Recipes, as shown below:

ObservableListTreeContentProvider provider = new
ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
treeViewer.setContentProvider(provider);

IObservableSet knownElements = provider.getKnownElements();
IObservableMap[] observeMaps = EMFObservables.observeMaps(knownElements,
new EStructuralFeature[] {
ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
});
ObservableMapLabelProvider labelProvider = new
ObservableMapLabelProvider(observeMaps);
treeViewer.setLabelProvider(labelProvider);

getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
(MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));


But, I am getting this IllegalArgumentException: The feature 'mSLADL' is
not a valid feature at the
BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput is
called.

Although I have been using our best friend (the debugger) to trace the
exception, I would like to know first if anyone see any problems in the
way I am setting up the treeviewer content and label providers for
databinding. Unfortunately, the few examples available are using
trableviewers instead of treeviewers.

Thanks in advance!
Re: EMF databinding Recipe [message #420235 is a reply to message #420232] Tue, 24 June 2008 00:24 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33141
Registered: July 2009
Senior Member
AJ,

Comments below.

AJ wrote:
> Hi,
>
> I have a view implementation that displays my EMF model via this
> mechanism:
>
> treeViewer.setContentProvider(new
> AdapterFactoryContentProvider(adapterFactory));
> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
> AdapterFactoryLabelProvider(adapterFactory),
> new ADElementLabelDecorator()));
>
> However, now we would like to make use of the EMF databinding
> capability in 2.4 so I have tried to replace the above code with
> something similar to the one suggested in the EMF Recipes, as shown
> below:
>
> ObservableListTreeContentProvider provider = new
> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
This feature isn't really a list though...
> treeViewer.setContentProvider(provider);
>
> IObservableSet knownElements = provider.getKnownElements();
> IObservableMap[] observeMaps =
> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
> });
> ObservableMapLabelProvider labelProvider = new
> ObservableMapLabelProvider(observeMaps);
> treeViewer.setLabelProvider(labelProvider);
>
> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>
>
> But, I am getting this IllegalArgumentException: The feature 'mSLADL'
> is not a valid feature at the
> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput is
> called.
Is it being called for a DocumentRoot instance?
>
> Although I have been using our best friend (the debugger) to trace the
> exception,
You've been reading the newsgroup a lot hey? :-P
> I would like to know first if anyone see any problems in the way I am
> setting up the treeviewer content and label providers for
> databinding. Unfortunately, the few examples available are using
> trableviewers instead of treeviewers.
What type of object is eOpenGet being called on. It will only work for
a document root instance...
>
> Thanks in advance!
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: EMF databinding Recipe [message #420259 is a reply to message #420235] Tue, 24 June 2008 15:39 Go to previous messageGo to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------070004040406010505020800
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hello, Ed,

Please see my comments/answers below. Thanks!


Ed Merks wrote:
> AJ,
>
> Comments below.
>
> AJ wrote:
>> Hi,
>>
>> I have a view implementation that displays my EMF model via this
>> mechanism:
>>
>> treeViewer.setContentProvider(new
>> AdapterFactoryContentProvider(adapterFactory));
>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>> AdapterFactoryLabelProvider(adapterFactory),
>> new ADElementLabelDecorator()));
>>
>> However, now we would like to make use of the EMF databinding
>> capability in 2.4 so I have tried to replace the above code with
>> something similar to the one suggested in the EMF Recipes, as shown
>> below:
>>
>> ObservableListTreeContentProvider provider = new
>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.


Hum? For some reason, I don't have/see the Literal.

> This feature isn't really a list though...
>> treeViewer.setContentProvider(provider);
>> IObservableSet knownElements = provider.getKnownElements();
>> IObservableMap[] observeMaps =
>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>> });
>> ObservableMapLabelProvider labelProvider = new
>> ObservableMapLabelProvider(observeMaps);
>> treeViewer.setLabelProvider(labelProvider);
>>
>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>
>>
>> But, I am getting this IllegalArgumentException: The feature 'mSLADL'
>> is not a valid feature at the
>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput is
>> called.
> Is it being called for a DocumentRoot instance?

No, it was not. So, I have changed to this:

getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));

However, it throws a ClassCastException at EObjectObservableList.

java.lang.ClassCastException:
gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
at
org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
at
org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)

>>
>> Although I have been using our best friend (the debugger) to trace the
>> exception,
> You've been reading the newsgroup a lot hey? :-P
>> I would like to know first if anyone see any problems in the way I am
>> setting up the treeviewer content and label providers for
>> databinding. Unfortunately, the few examples available are using
>> trableviewers instead of treeviewers.
> What type of object is eOpenGet being called on. It will only work for
> a document root instance...

With the above change, eGet is now called instead of eOpenGet since the
featureID value is 3.

public Object eGet(EStructuralFeature eFeature, boolean resolve, boolean
coreType)
{
int featureID = eDerivedStructuralFeatureID(eFeature);
if (featureID >= 0)
{
return eGet(featureID, resolve, coreType);
}
else
{
return eOpenGet(eFeature, resolve);
}
}

>>
>> Thanks in advance!
>>


--------------070004040406010505020800
Content-Type: image/png;
name="Picture 5.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Picture 5.png"

iVBORw0KGgoAAAANSUhEUgAAAaMAAADFCAIAAAB2LQpQAAAOJ2lDQ1BJQ0Mg UHJvZmlsZQAA
eJyVV3c01Y//fr3vxTWvvTfZM3tkr5RklpF97XVdsxAlDSKRzEIqkpUkkZKR kJWMomtkE4mM
jPv9o+/v9znnd873fM/v+et5Pee85j+v8wDQc7jh8QEoAAgMCiNYmegL2Nk7 CGBGgQJYgAHU
QNLNIxSvZ2FhBv8RW8OAAAAMyrjh8QEeuVfbOGYzGSfcvo3uStiv/ec8AADA EuzsHQAQaQBg
8f7LdQGAxf0vtwEAlsgwfBgA4gMALB4+bjgAJAYApAk2VgYASCkAYL3/8noA wLr/5R8AABvh
4R0GgIwCUDAF4XyDADArABTaOM9QDwCsNADgcKEegQDYNACQDQwMxgFgmwFA 3ANPCAPALgCA
jJ29g8DfkZ3DAJQVAMjG/tFCRABq7QH44R9NTAuALQ2g6sQ/2oYVIACAsPWF eikqAAAAQqsP
QE4kkTZEATDpAAe3SaS9ByTSQTEAehygOcAjnBDx73shSA/Af4v/7vxvoBEA FAAwgBqEQQsi
i3SgLqFxZCHkxRgyynxqG1pBLDUDOeMGM5G1hh3PieXK4P7Dq8cXyv9QoF9w V/jIEXORWNES
sT7xXUkeKVNpf5lk2Sq5PvlVBRpFISUtZTsVvGqiWr56lcZLzcpj+VpJ2uE6 Lrrmetr6EgZc
hlSGO0bzxiMmnccbTStO3D+ZahZ3imDucdrGwtBS2Urcms+G1ZbpDP1Zajty O5L9rsOG48q5
WadJ528uo66DbgPu/R69uB7PXq8B788+o77jflP+EwF9gXVBucGxeFyIMUEy lDZ0LWwgvDoi
I5IQZXFe/gLdhaXo9zGFsTEXbePk46nipy41XX6YUH2lNXHo6uI10g3WJOlk g5t2KWGpqbdK
0t7fnko/uMOVqXb3bFZEdmbOi9zhvO17rPflC9QKFYqkHogVCz7kesT6mK6E ohRK959sl20+
/Vm+XLFQOVc1Wz397HvNzPPp2skXE3XEl+P1A6/eNFQ35r9Obop+4/v2TLPe O5kWjlZonWvr
ba95n95B+GDZKdtF1fW9u+ljZk9Ar04ffR+xv2wg9JPGIDLY+Tl56NQw/XD/ SOqo2RfqLx1f
E8Z0xw7G679FEpWJGxO1k6FTilO/p199j5pRnlmfLZ/zmhean1h4sOi7pLJM tby8Mvijd3Vk
bX1d7FfMxtLvm9tWu8571YcmJBIAMIImREMfoo68Qp1BM6K3yakpTmOaqXA0 0nQS9NKMOswm
rIrsdByVXMe4C3iW+bj5jQXwgplCjcLTIgyiqmKO4jES9yVbpCalD2X55dTl Tx/1UbigeFOp
UPmZSrNqn9qY+jeNbs2aY9lasdpuOqa6Cnrs+oj+ksGQ4RujJ8Z3Ta4cJ5i6 nDh5UtVM7BSL
OWK+enrMosuyweqpdYFNpm3SmYtnQ+xw9mcdzBy1zyk6STsLuXC6MrvRu1N7 YHAUnhRelN40
PlhfZj9GP5L/TEBHYFnQrWA83iZEicBO2A4dCasPz4oIi7SNUjhPf375wvvo BzHRsXYXFeJo
4ubj+y71XB5K+HZlPvHXVdJ1mhucSWLJ6jfNUlxSI2+lpD2+3ZQ+mrGZyXhX Lss8Ozjndm5F
Xm/+t3uT9+cLfhZuFe0Xkz2keoR9zFbCXyr+RKHs2FOjcssKp8qAqqjq689y a0qev6htfzFc
N/dyvX6nARrRr6masG+Y37I2s75jb+FoZW1jamd8T9eB+YD6sN/5u+tH99zH iZ7R3sG+jv6K
gaRPuEHtz2yfV4c6h++PhI2afuH78utr61jmuNc3JSKK2D+RM4mbkp3amm7+ fm3m1CzvHP08
7QJ6YWfx19LS8veV4R8Dq11rHT8717t+9W183VzeQra5djR23f7c3Hu1v3LI R1IjkQCAFqTA
HjKBiBgi7Sg3NBd6jxxNoYi5RUVFfY9Wm26Z/gojK9N15klWfjYDdlMOLU5Z LkFuKu4tnlne
Ib53/E8FMgSjhdyFTY6Ii1CLLIi2iuWKB0sYSXJJLkm9kr4mYy3LK9srd1Fe Tn7s6HUFVYUZ
xdtKOkrLylkqhiprqrlqxmrr6rkahho/NO8e0zk2p5Wiraw9qZOqq6+7r1en jzeQMJg2zDOy
MaY37jK5etzIFGXafCL+pIEZ2uz9qWRzy9Ocp6csyixDrTStDqybbGJtNW33 zjScPW+nardl
X+uAdzzquHqu3CnQWdJ52aXM1ddNym3FvdIjBKeI++1Z5xXmreD906fSN9BP ym/RvyTAI1Ao
cCqoMNgVz4sfC8kmnA1lC/0clhFuFcEU0R+ZGmVxnvP83IX66NQYt1iVi9iL c3Fv4/MvRV8+
l6B35UgideKvq+PXOq4/v1GUlJ4cdzMgxSH1xC3NNOnbPOm06YcZv+4sZk7f Hc8azf6SM547
mbeQv3kfKWAoFCxSeXCy2P1h9KO7j5+XDJSulGGfKpbbVcRWFlW1V6/WMD9X q3V5cb2u6uXw
K1SDVKPt67im8jeDzcg72Rb71mttz9uJHbQfdDoDulK7qz9+7FnsQ/qFBow+ EQZLPy8MK43c
+UL7NWfcjMgxKTztPjMzP7gc8pNlW49EAvj7+wAAKFQA8moA7KYBrPMBUrIA xNkBWF0BLOgA
bNQBmfMC5PsIIMot//s/joItREAGVEM3zMIBwobIIsaICxKJpCGlSAsyjuyg WFBHURYoPCod
9RJFRGPQSmhPdB56mIyZzIrsDtkoOS85jvwp+W8KPYpbFETMUcxlzCjlUcok ylkqA6pianJq
f+oBGnWaYlpG2jjan3SedN+xgdhd+hsMvAzVjIaMRKYIZibmKhYLlnXWDDY1 tgn2GxwqHNOc
6VxGXH+4q3m8efl4h/iS+PX5DwQaBC8IHRMiCbcfSRGxEeUVXRJ7KZ4gYSUp LLkp1S6dLeMn
qyvHJvdDfvBol0KHYodSu3K3yoDqmNqc+q4m5TEBLQ1tG51w3Sy9d/qLhhxG xsbRJjXHv5kS
TwyfHDTrO9Vl3nG63aLVstWqw7rNpt2288yHsx/tBuxHHIiOM+eWnTadD10p 3Zjd+TzkcDqe
dl63vAd8sX5m/ukBQ0HcwV746pDdUMOw1PDxSJmomPM90TwxIbEtcczx/pfa EviuRCUOXdO9
3pAkl1ydIpX6JE3q9vMMrTsddx2yNnOS8qTyh+7HFyoWLRc/eeRXIle6XzZc Xl9ZXJ1dk1l7
u66g/lnD+9cLb2neKbd6tN/u6Ozc/ijbe64/41PH540R1S+XxgaJopMR0/Uz s/PkCwdLiyvl
q05rm+tBv7o2mX+bbXlvR+3E7Hr/Mdlj3yPu5x8YHqwcjpNIACAL9hAHRdAM 32AHYUakESPE
GQlHUpBHyBtkBPmJokaJoPRRrqg4VCGqHfUDzYY2QkeiK9HLZJJkfmSVZBvk GuSXybso2Chw
FLUYDMYBU0VJSelO2UTFQ3WRapLahLqahovmKs1vWm/ar3SWdP1YF+wafQID N0MN40nGRaZE
ZhHm9yz+rPSsL9ic2CnZ6zi8OFk5O7niuFW513me8vrwCfNN8N8TcBEUFlwU eiZ84YiJCLMI
UbRSLE7cXIJP4pdkm1SWtL+MtiyL7LLcO/nio7kK2Yo5StnKBSoPVavVGtV7 NCY0f2sxaIvr
nND108vQbzBYNGIxNjGJPV5u+vrE25PvzT6eGjAfOU20mLNcs9q1JtlizjCc ZbMTsBd3UHLU
OmfsZOHs6OLlGuIW437dIw9X4tnute0j7mvtl+jfGLAadCTYBZ8TMhBKE2YU Hh/xNnL/vMaF
qOgXMTsXleII8S8v7SfoXUlM7L7Gfj3wxrtkvpsXUoZvqaRlp6My/O4M3jXM epUjmVuUz3cv
v4CnsOCBSHH5I6XHTaXGT8aeJldYVfFVr9a01d6pI9RbNyi95n2DfXvwbrt1 p/3PB+outo/y
vUb9Pp9ufrYdRo80f0kY0xk/JL6dTJ4+OcMw2zt/ZVFnaXOlaNVw7ft63Abb ZtGWxHb1ruKf
Z/vKB09JJADQhRDIhxaYRSgQEcQAcUPikHykEfmC7KK4UdooD1Qyqg41h+ZC W6Mz0RNkMmSx
ZIPkkuQJ5EQKbYoiDCUmBEOktKBso9KiaqTWoX5PY0EzSRtOh6WrwHrTi9Av M9QyXmayYZZm
oWRZYu1na2Sv4CjmvM9VyP2Ip4y3hO8ef7ZAlmCuUKFwyZEakQbRTrFR8RmJ bSmMNKeMpKyO
nI180NFMhRbFTWVRFSfVXLVhDR5Np2OlWms62rpJehMGcoZXjL6aKB5PNd06 6WzWY655usJS
2KrQhsM26yyrXZ6DiGOlk6Zzt+s5tzWPZE8+r2IfYd9sf9aAtCDK4AT8H0Jg 6ET4qYjmKNnz
+dGYmIjYqbgT8Y2XZRIKEhmvXr62dSMwaeamY0rPLe20inT+jBt31u86ZLXk COVezpu5Z3C/
oGCv6OyDmoe0jzwfN5WyPAkt6y7nrwit7KwWfHahZqhW8kVi3fd63Vf5Dduv zzS9fMvUTHj3
qVWp7W777w7nD2+7BLqvfVzttex7PSD6KW1wc8h+uHvU7EvHmPn4ZyJuYn4q YHpxxmG2bV5s
4dJizzLNiuYPt9WLa1d/Xlu/8stnw2iTbXP6d9GWzTbl9qMdvZ3xXadd4h+X P317CnuZezv7
jvsF+xMH/AeuB4UHk4eCh3aHKYcth9skaZIrKZPURSIB/PVLAABAbRAcEEwQ MDMw/C/m7v+L
wIDw/+mBAACtZ5CtNQAwAQAPGEAwBEAwEEAAzMAADAH+ejUAAAoGgPxAAICW ip/x/7dumGdU
GACAQTD+PMHX2ydMQA+PD/AUMAgOxIeHeRKkBUyDPGSlBRTk5ZUBAP4Fni0x DZUN4LwAACAA
SURBVHic7J17XBNX2sd/AwESNJGAgIIX8NL1UoIr7aJVWoO9aLUGa61thVbb LdjWKrZvYbGV
rtCti70BaxVsFVfBrau2Ym1huwWsWoVWqAYFVKigErkmkkEyIRPm/SMJhGQC AbUFd74f/ggn
5zznec6ZPDlzZuYXgmEYsNDyz5S1TXM/fvNe994KOTg4OAY6PNbSutM7MlQP HOie0VgLOTg4
OAY+Dixl7RffOSJf+eLy4b0WcnBwcAwGWDJdYfb7lf5/fmHMkF4LOTg4OAYF lpmOVnzzl/Pi
D5+e3WshBwcHx2DBYp+uJWPXfsmchPsEPRfePPj5O/+8gaEA2lUTH4jfOGfc LRdycHBw3CkI
82uvdac/fubI0AN/jTTfjGMtbL2hbDWkST3Nc3V3E/BuvZCDg4PjDmGWYgzX HF74lOVChEUh
MNTNfaiVrVss5ODg4LhDdO3T5f3r/cpRLyz373bNgbWQg4ODY3DRdfbaVK/g Dfdxc+z2Nmsh
BwcHx+CCsPGMBAcHB8fdA9udwxwcHBx3F1ym4+DguPvhMh0HB8fdz/9qpqMp iv69ffjfZFCP
/KB2/n+bbpmOqslfF0oQBBGReFgFACBLU4nAVPJ3cc1G72RJKkEQBEFEpJf2 ZoDKT92cW0VZ
ldO5bwkEQel2xEU1KhRm7an89MT1iYmJiZs3b96cmJi4ft363KrbMjxUyeHU sECCIIiwxFxr
j/vo5y03p2p2bU5MTFy/PnFz+oH8WzHdnZ5GnipN/x0PNjsY1M7by92aBMwy HVX6st/c/BnZ
1dXHEC9zTzxuLJffRrf7jlXvQslKtVqZlyCRt+h6a6w7tzb25yaNVTkvOOpY XuYTwl57J896
+fr+bDbMQ4ReI7xGD9OcjI09OWz06LH+Y4fwnHo10yulu14Okq2d/4m8urL4 6dHOvQbWq5+3
2lzXvDs2HuNnTB+NfUvn+gYn1vTXdnd6GnmdTvs7H2y9MKidt4+7Nwl0PSPR ePJfmYirfn/R
WCC1MClzxvaKuBBfAIATANAUzeN3e2qLpiiax+dbPMlFURSfz7fukKYoWFW2 B8veeUKhEJ7D
PMC20LDsXQIXtkQknhQSylJsFZHAVQrpkC4L/ODnooIBukK9dpNL5IoV1nFa h8k6IN0KqdLN
KzPDM8qjQicBGDve0iW28ew+HZZ+9tJ7782dAEgXPL1oOm9RWIiX04TddeSG sULz9hZh2vLT
Ehsj39mpPc7bfyxZH7SszQem872g19E3G9R88ZCGc1d1N7WjZ/2B58wD0KHv UP1ar/y1Xuzv
NfweHwA3rjQNG+3Roe9oa1QLR4p1mnZaqxO4sTwOcBcnga413dVzhQi/1xsA IA58WIrMkhoK
ACTU2fx0gnASOAXuKmo0VK7I3RxIOAkEAieCSC81LgaomuNRgYRAICCIqOON hv0M6sC6qF1F
JXvXBToJBE5hu0hQB9aFrj9QZeqW3BsVtvm4AgDdWLI5IpAgCCIwMGL9AaNR tt4BWGdytt7Z
RqHqQCgRGBYWun5vhXm5dURkTUXRseJmNMtPFpUUFRWV1nQa1egAaM18sA7T pkvWheSlk5mQ
rFwwycLVqtzNBOEkEAiIwPUljbTB+Yh1e0uO7yIIJ4ETkXq8pgc/rTvqU3MA Og0A8MZKpGju
IUwrP9mn2NbIg6xIjQolCEIkWQupi+3ZZO+dZYor9kas21VkedgMDuftpyL7 5+1/ivvq+S3/
WpT0Rdjmb1fvMJQXJn+T8dC738dkZTz47i+7Cm42qnfO2nA5/9xPW3I/nfpG y9Wmgnf3/fet
Paw27+YkwJgoTJBIkoqN/2iKZUBKsVItTwMARBdW1xamhQPh5TqG0ZWHA7Ks coZh1A3VtUod
wzCMRh4ORO+XMwxTnCaDNEPDMAyjTpMBQGRGYXleHJCkZJjanDggstzQqDwN kMk1DKORRwLS
hP3Vak1lThyQomQY9t4ZhmGY4hRpl7e2e0+RIKlYyZijUzc01ObEoVtztogq c1IiI8MBhEfH
xUVHR6fkaEzV1fIUIEXd1Z4lTHaX2ArV8hQgoaGbl8bYs4prGZ06L0kKJNR2 DUjksera4oxw
wyix+8nekf3Ni6WQFmsYhtEcS5IC0ZU69jBZ/WSfYvaRr4wDJNFZ1Up1ZV4C JCnqvhxLrNg4
bAaJ8w211dW1nVRX1yo17DXLviza6PRMhvSv1+U1efFfpE5ayzBMQ/m194e9 cOLDw5obN79a
+Wn6n+LU15X/fDih8B85WQs3/d195dm9x/c/m3z6s/+y2ryLk0BPC0kKALRA uFzzSQAf1EOz
gX0tGkDoK4uULF0+OaIqbfXSJ4Mn8WBcmEBWcmjzrzk3qrJRgDJqxXQ+oIY0 pTB9RTCoEYWF
GiEgnhcVB79PDq1Pf8r7i1dXSdPkAXw05v9rOxIaNjzlCVB+I2DUHmDtncVV m71bwxN6egp9
R0i7rXt5LBGNn7cmfV7ppe216z54f3qvC26rMFldmshayGbvUsFWhO9/eroP gNA1mySxM04r
4qQAICtUpwcLQQXdbxglVj/Ze7e7OQARCoIEBABIo4/VfjCexx6mnM3PRWxT DLCMPCn/ZhMi
qz95bixAeQ4z7MjYfyzZwMZhMwicp37M2JhW2ubt6mr4v62+Tfb3rU9NYqtO wEXkGrbrVbcx
nqqqurO7fwBw5USFXttenX/uyrEy8vqNG9WNYCAa7dFUfk11ucFPOrUy54y6 Vuk1dYzNwbNw
yOZ4DrIk0HVou3p5yHN+pTGdB0Bz8zLwoocQzYBk9kQ+AOjatIDvMAEA4VPp ZxvWHf9y9/YZ
k1dJE/K+2xAKnRaIfPP55zx1bXBa8tJ6gS8fALTNCJNOAQD+2OBgQ1djo7Ij /WS7o4rHryyQ
FmYHALh67htI1xn8r794GRJ/ANCx9s6Gjd4tYuyqblnAEhEPAKUDANrW7210 wRImm0s6dj9d
gPhTig2LfCysOpteOHmY+oFk/hShVQjWfrL2bn9zQA1JXu2JB9wF5vsqbLPJ 6ifLFBv96h5h
w6/nIZ1pOF1S1nbOu/3HEhs2DpvB4DzP775Hnh7V3lXQjnEiG5e8CMJlmIDH dza8JgjjTpTA
Qzj1mVkuIoGh2NVT5HGPT9n+U/xhQwKenZX39r8cnXii0R6sJu/iJNC1Tzf5 4T8je2lmiQqg
cresliMlZCwPToC8oZ6iVTXH44PWSpNWT+IBVE1+fil/QkjU+3vkGeEF8adJ QDhxtgzbvzyn
mxQQMMlP1HKludMypbPcNRv7+LpIxAcFLZembAoWAoD/H59CQd5ZhaoqP9VP lgwPEQD23mF6
58YNkiIN9zfZ6t0FuNFQq2pUKBQKRWPX3ogTINfeICnS+A3NFpGJghNnFQCt qOnlXguLMFld
Yi3kBzydJoUsPNWwQ6ZSNNKAf/BLyNzwbYUKoIr+mVCAuEAfHnSAXGuaV4v+ u/nJPiB2NwcA
eAwRCq23jy3CZPeTbYpZR97rD1NRsPtolUpRtMt3fjI8XGyNEmvv7Ng+bAaB 83CGczesr3X0
wOgH/qBr07ZeV41/RDI2ZDLh6MB0MJ5TRjWcv+otGTP6gT/QlI7Hd3Ie4sLa /C5OAl37dAzD
yLOiTW7I8mo1ZlseACBLyDZuLmjKI808TsqpNhQri7MknaWR+42n6FKrnTKG YRimPCsSkB3r
fEdTniA1tszOSQNkxRobvRtcTQs39m4yztp7hszMUWma2qp5SrG6h4i6jYlZ c7U8xbgpYypg
DZPNJfZCRi03hQ/D9gTD6IozuqYjp9o0HaZ+zV+z+mndUR+aa4qlkBaaRWg7 TBY/2aeYdeR1
1SnGOQrPyIjuwfkejiVLL9kPm8HhvP2cO3DqQ99Isv6G8bVPJMMwer3+eNKh JM+X0oJiksev
3vlQPEVqGi8q/ur4dOkXP+q0uqwn/r77sUSdVmfL7N2aBCy1TMhGBdkGgbeP uGvhR9MUbX0l
mSJVGhoCobh7OaVSaXgCobA/l5JplYoUisXdW7L3boNb6d1WRKApktRAKBb2 684AVpfY/VQ1
KtRtcPf16ezJ0LVALOz9Dgh2P/swILcSZp/8tIZUqZzEYqu2/ZxNsjRVJKEa dDFigGfXrSgD
yHn7MdxlIvJ1t3jNMEzTBcWNy/VDR7q7j/d2EQpgutGEIAgtqemg9QJxT0q4 d2US4FSbOO42
yJJEUZCLkokR/96ecAwcuEzHcbdBk4ryWkye5MP9OglHJ1ym4+DguPvh1ZNc puPg4LjL+V9V
beLg4Liz0K2tlOmF9e01rIV3kMG6ldF68evUr5qff3PFKB4A0NdPpO8u0IIC vKeGLph7/3ge
AKrmi7TdCi1FwW3UpKBHHwsd0aera1TpCq/oNYq86Xf8FxupE9v+oXvsdem4 fl39o6o+T/q0
gT9ymAu0Ldcpr4VvvBKKq/lbD96MjH5iKACqanfK8dA3V4ziofXqidSY1anf yAHp56cPLbzH
6cTOD441gg++iwu0WopSUTMj/yIdJ4TVIFM2bAKU/NvtHydG557HvLdz0mIf 49OKL7fsqNaC
ogCovGa99ueHx/cQgf2hNl1XDh3p0zlM7PP++2PpJ3X9xI7dBVpQFNzGBTw4 //HgYbdsk7VO
0c4PLox57nnjaKv+k7zFedFb0nF8q3kX9nDU2fXh6umgpeTZ/4iOiC2bmlx5 ag3Ob50wMxoL
4g787f9mjzNeJWplK7wTyNNyfs0u6rqverBB/7xzQ+rfXsy/YHquuL4k8W/v YtR0P1H1C3Mn
rt1fAQB08/74dzFuhmQUsiMeniZNvNa3XnS/lSaXriI29pdma3Up++AJxk+b Nc5Fnhgv97l/
lmSKJw+gm89tjpd9ccagMNa062/JDRRAV22c+mDxtA2FFy4X5Mb4CJwAuAq9 vDxHi6iTifEn
RaNGjxo7xtXJcK+q5SCz2wTKs15+9Jno0L+fPX3m9KJRTjQAqi4r/t0fMTro /imSafeNH27r
rvY+0nr23j+MOtvaVcA+7787Vn7S9SWJf3uXGjVD4nkj+pmZi5NO3LpNNnQX Dr4bs+HLJkOn
V/NfiH+3Sq1hnXfbR519Hy7bB21R8oJHI2Ijcy9VH18zFBg6dc01xbV/Tit8 aprHlxeNt6Wz
Ft4JRs+dFrBqPuHoMDC+AvsKXVOwVQ4g/1jZ81ODAcDJBZDNX7ZkMm9JwPDG kJe2v7X4Yz8e
AOnDi5+Q8J6YN9Nz1LQ9Da0bRvW4QGPXoLk1bCnYdGMqu7qUXTZ5PlLZEvpi bXS8S9jjS4yl
Ti4A3nl7z9Jv1gyDkxgeAEC3FAMbopb4uQEjxxoqTl8aNR2gL6rf+cglfLmZ DhX7IFvZpEq3
vJK1ZFvZ8w9NAjBqnMElAJAtfOaxqf27R40tTAB811mQCsxnx+a8w5YW0y1O sV0qWDb8XLzs
icm8J467lIW8UtISO3tYZ1sWP60KrW2yIgKOZxVfXffYaN6l/x4yGWOZd8DG UWf/h4u1edN/
ZPEFMbn1zzzg2VnGG+rzWOw3WytdX333i8f/ZTzGWAvtRK+jNY1qF7chyrKr Oo12ZPAfHJ15
eq2OUrUOGSEG0PlaPHHksHHelQd/HJRrutYL32+HZMkySW7sd3VdxWodBQAT H4magrNK0/cE
TQEAb4xkllF6CHRTyacvTxshchgxc9prGw8avyapmt1rp43ycvVzdxgx8+1L 3b9mLn37QejM
iBPXaZvNWys+XzvXULjCVEhdPfHWTAc/L9cRolVFTbdnV8KWTUoHQGvWhwsA HI/O/Jk036IQ
AwX/ZZFptWrOOsgsNlurTh6E5NnHLCWn+oB9Q9d6taLkx2IVmsuKiuQ/F5Wc 71SXYpn36u8/
GCFy9vNyHTHzbXnnKFlNMXVx74q1e409Gl9T/9m46tP96UtEDiu2fX0kae4I 0eKSG+wuUb8e
fO0ve+Und40QOfu5O3x+sqZHP2F4IIrWAiEiw9NYrH5aF/Zg0wJnNQD54WOV gCo/OguAsxMP
tuedZTb68uGypmhHLEK2RZqlORP8JxNy8M2L33ZbwbEW9k71N6cPzlmfH/lp zjObc5d9cPz/
dgKo2Hs0e/5GraoVQMXeH7Ln/9W8yaDMdBf/uw0LYja8FQO8e/qq1aTzXceg 4FyNce3N4wGg
ira89SNC3fkAVRo37r78CRtOK9oKExcc/KhWDwCq3Uv8Y9peOa1oq25oLkhd YrpHWyTg0/Kd
i0OeyXrjn6mzR/LYm9NV7/tM2St46fSVlsLEBbmGQqr0zakPCv5ytk7d8V1y veyFzNuwRrff
pk6NkI2b35QkrslooU3fvPzpf/9i4/aXAkcseLvoV1XPXbEMMqtNaIElk4Zb NhcC2dsTP0/+
4OOkD05ctR263UPXdOG7f32ZVwb58ZzDRw7uO3SswnLiTfPeej59xpOxW49d q1O2HFhW+Oi4
TXUA6xTTbU25GU1GR4yvdfU/bU98KXflnqTcWFmG6NWYqdmnLqlYXaI1TQe3 hj86rzD7/LXv
ti1/Z152S09+Zp8pKZV/nyqNzv78H8/wAVY/WQt7j91EuwgADu794dqvJxIh mQK06+hbnXe2
QbbRWpH3N/mGvz7NfuI08qGtC5B1oqz3wt4gHB2oJjWlIp/Ifkfy2uPXfywD 4ODEc+Q7Ge6a
c3BydOQ7mzcZjGevitx4eeSXj4y4hxcDHDhWvnB5QPcKTgCcnQBAiIJHvRwA ICQ6+8JmPx6a
fvxiDzaei10yHKDGeANwBHDjfMxxSbYiatRQAPzJ94sBgIYQ2UkRzrnfRH53 5SuJGwA0FbE0
bz33TSoiT//9uVEANdJUWHXyIDDvzKFPL+e2XM7GcVykVkhu6WSuLzadAOVo 2dr0XR/NzMzf
P8JUPPHxDdd+XXrgw9dk0zwidpz9YGkAW2OwD7INm7YYMWl6QKBY14ZRth8w 68PQPbzmg4dL
f81QRL33N0nnitIyZjg74de8bVi2f9E0HwCzV70/JX7m2etxIwQsU9xqdvLV JZKvROSX2+eN
+xKIS39F9v1uNDuxuzQOAGTfKtKmDwU17X6D8362/czPiI/Zlz1vW9nCcXwA vx5j8XMkW+Fj
bDbZqcaGL/aXPbP0+eVYkpQdfExmyEm3NO9sg8wOVVcMyFxtucif/IhUpban sDcIOIkEoWmv
CUcPb7lcd2HvD722GHyZjr56KhXAhmeu7EAugL0nW5YHOBreM0TTeDEX0jU+ QgAkJAcuHL9P
3CU9pCj7BiHRhu+cpspqTPUzlE+BvI0CLL+MpLMfmZH7zaay6kTJNE9bzZtq yhAyw7CsuXHd
ZFOnBSJfefY5d10bnJ587v8EvV35tWMubNtkaXxe7eIW/GmyTPrMUkAW1dnN 8EnP/D1v9sNv
3/fk5hef2DOZzSubg2xlkwcX4N3i6xseG9nNAgmEzl0QfE8vMfdt6GyJaFnN u7kWU+eFPfYp
nmpU9ejsvR0YM1IMWoupY9xAGxWU2FyiocXUefcMNTrVBbufsrc/++rtmYtD XokrWfDVdDfY
8pO90D4BsXZAOOHBZ1/FU1uxYemM+iNdb9mY9+5a6X34cJHWzcFzHQe0wxZ0 3cUCjNDZUdgb
BOEscnXkOxleEw4EAAIEo+8gCADQKlsZfYd5i8F39nr5WCZCkgu//uLv/zhw OjcZx7eVGs8/
mq9faay7mB8/dSlWRk8xHtAert2lh8YGLsHxvLLrquofUu97JhnuIgBwG7cQ eDYuvbqVoilV
9fmKFhoASGDW838r3BMd/aD37jONtpoPnzAFx/ec+lVV9/OuaU8mw90FwNAJ s+dh+zfluolT
AyaOEamvdinY1J3c9dra1EtmCxJnoKWptqVJUXddUddE2qppwybd2ko1tbQA 2hutpPltSjQw
+flNEZ3/3qiSXzRqTmtuNgP3WD+Y3tsgW9rkT316cwhe+HPqNRoAWq4b7QuB a5WXDBE13eg6
e7WIqK9DBxT8VKoA6LqrnepSlvM+9r4XsW9D3kUVQJXsTfwRcVNH8tinWAec P3Gxibx2MrWz
dwBaQ+I637Vxye6SDjhvUwXLyk812YqJL34aMzX78bf2UmD3k915mzZZINv4 s/9y6dtjl6XD
+e1KwPa8Wx91ffpwsRy0PL+ZC/DOkZ/ZPaMrD2zFwj+N67mwPDtxybNvy2/0 eV/baSifalbf
rFOV7yk4k3rE8u06dceg+mvZHIKILy6b/r28Boj88nLlqZ2dEc17dedpZUed uqOu4fQsSL9V
dLfQUBYTYqgY+c8vtwGy7xo66tQddVdOr5naaUP2naKjruH0PFPzgm2RAD4/ 08beXHlt8zJD
4fLkbdGYmlyp7qhTd1w4ljml0+TK/dUmH/6bNAdAyum2zqCSF5hNSci2Sps1 2WwqTs+CZfPK
U8mYarRz5suNhoiqT+80r7g5t3MYDfWTK3sZZBabdeqOOsVZ05gASL6g7qhr OLvErKMpCafq
bEXUx6Er2GHSFDKGyTbv6vbvtnVJD/3rvKkv6ylWXt5gms2tO+IQsq1S3ZIc gg2n2urObMPU
bdXq9uQQbDjWzOpS5altnQ6bv2bzc1vncF07sx9AzNfXbPhpw3krmxfOXzp+ uqzr71TZOYVy
cwjeO9Zi/mHZcKzZxrxbH3V9+XDZOGirz2QCeC+v2eqT2/bPV4GpSed6KWz/ 56sAsIHFQtff
j3tOJo2M/LVKZXw9IrJO3XHxXP1H/q8ljXj5gzGv7nnqk4/Hv26orFDRO+dv IurU3dZ4/xvQ
LTfIIW5i6/OA1hsqPXhD3HpWLrJsTreqKL6QT4PH51Xvj5jx8f2Vp9aYTpKo lhsaR75waLff
omptUmG4px13JLPXZLNpJzTZ1EhSNNxG+gy9rVsXLU0KUmOH2e4R9XnoAJoi b1LobY6M1Vzc
LLWYrKbY5sHARh9G/lb8tOW8mU3qyF8W/PkHzHI3vqU63hx56vgzU23Itt+x ebemPCtC+kpW
5LbvIxc8MMqND5qqu3L24NszE7+RHrjwn9mGJSproZGaeJG/97GW16bZ1M83 3GUy1Mfd4jV5
pVF1oVY0foTQ16PzjhMAlLJ1kGU6QqkR7CoGoFkRBGCAvG5XHLtn+9+efjVa mnf8lwsY/lVW
xB+H3xb7jPttuud2oNJ65oMJD8ZGvBmHik17vsF7efV/vt/6BgWOQUbdma+3 vi3brjQ8I5E+
YeYrS97cGb12xUTj7iRa2QoBANSXL7u+ip0XPlvR98dIeoKn1+tvq8E7i2vm L65//R6AnucA
YIC8dgV+ic5oaGr+44XQJQB5/irOX7XfDs0DAcL1r3kAY1Gn7bUefi7hbkAQ 8GrJT9Lyysvt
M4++khw0djh/cB2QHKx4Bjz+7mHduwD0ekz6c63qzwCArrkVsBUCAJxmv11T Ndrnth8HvJ9O
9f3BlN+RiVqXFcMBaCe2AhhAr2e6AW6NPL299Se0Mgzj/ILH+foqna4IwLQX xAQI7QSSIIiu
+oNrdvqLq5uXK5j6S6frL/3ernAMBK79ettNEgxTc9uNcvSVH364PHPmTAcH BwcHB4IgCMOl
8r7zbd9uwOTguFM8PqX3Or8lg+8uk7sVvV7f0dHR0dHRszZqS15hoaOk0FHS klf4m/nGwTHY
GXx3Dt+t6HTGO7IIgmAYxtayrvzRyBl6OYBCR4nhBQcHR69wmW6g0N7ebjhv dXCwa6HNpTkO
Dvvhzl4HClqtVqfT6fV6wy9X2qo2+bvtt3j2qlE2tihV7YP2CqdG3ahsaNRo e6/J0Tf0iqJD
hxsG7YHRM1ymGygY0lyv+3TD5s6YoZfP0MvLH41kr6EtSZxK5FwkzUsSphLf XmyFturg68RT
IV7PhbgvloRWKksTpxILLP4Wp7KoPWpLPjSrExebePYKyVKeWcJaYuq95MOp xIeHOrWDVIdX
hp2/aXLvXBG7M53NAdysOPg68dRMrwip11PTiX9+U6I3c4/FsmUUrPH+/dBK YsHGA6anNemi
JGJBcm63QBZH/FjWyBJaD2gLX5tKsPhwK2grtkwlVm87blZix7wYnLcH6mrC 2zLVHZTF/D3h
zl4HCrYyXWrRV19fOAngiT88sCZ4sT3bc22AjqYtSmhapzyzY2d+9Ocln4zk kVcvVIuHTf6/
U0o9eI6tPyc8su6p/x6dMhR6CFgf3dAA4emVS/7ofqP54vEPZqyff+D9guLA YV3l7Xo4uggB
uXWJoXeDnYK3JTOna2aN4Vu65zDOhjNlpuaKg+GTd7olff7TGyOH8BqK01c+ H9TuWv2ydGwP
lrvhwh6vY92IzxYvzV2sXCQRt8o/TtgtS/lpHlCiAcJ3VoZNxo+fTHh/acDe koetQrONy71/
2V8udrHxrr4iUTL5vq8083tTQDBH+fPuHABbtle+GDLBZLmneTF3/nxM7zfi 8pwkkNrvz+CC
W9MNFGia7sx0nckuteirPWe+e8Rb+Ii3cM+Z7wCM/eBNw9nr2A/e7GsX2pZm oEnZQsNROHpK
wFBHnkAkHioSCjzcAI+hw8QCkXioiP2z1wYMcfdyHiL2GhO85B+VYZB/8Z3c UO7mM9Z5iHio
SCxw4bGWdGKQ4n5/7QdKlh56cUZz8eudFyXvfxQzcggPgFdQVEqc9NDqdGXv lnvpQnBPeMLz
SH92i1Jb9a9nY8PSt04YYgpZ7CUQjb9/bjRQpdb2EFrrtyuIw2Vmq2HttbzN 6U16QFvx2cp1
RUV7DcvJgwVVAPXje5MLgS2LBas37rVbU1914qNNM1YnzUBmwcmuO8N6mJdu zrfVHHw90LDK
2/Lv44a1sFK+17TIjajstvxUfb8xMHHncb2epVVDUfrqqcSCqYGJr4fGmfxv KDYUElsOFQ3M
018u0w1o9pz5LmSkMOax+JjH4kNGCu9Pf2XkGy8Yzl5HvvFCX62NfCjmxT9l xkidtuw8rOzP
8di5ThwvjZPKD55oBVyBLZ+89a9t6z9LTr+uBQBX4Nj+rUcP7cr5t2UvQfbb DgAAIABJREFU
bQj/+Os8ycX4TzNLgL496NZUlgO8NN69q2TMn5YBhY03b9UywAt65ZgE8RHT JxxamBE+28dQ
6grcVClbFcf/HZWMpxf4uLAEa4If8HreH7vJcrVV/HyGogG6re6n5IQXcxb9 t+HTT6J3rj7Y
Cv6MV/L8gfD08g/+70k7fW3/NTv9ojQiMubp1ZJDqdnddxjY56W7806TVuz7 6jyzb39KzsaP
LmuBhsMRzy4X/63wQIlmb0GSr9F3kQuPKtro/kn1S2teDHGEZSt9w+GVL66S 7qw+LD/6+B8h
P9MEAA2HVz6/KuK/um9+klNvzyi4MhBPgLmz1wFNpbJ2qd99htcjXIZWKm/t F2Fcxi/J0AQW
bE9eLYv4KDLlVPoE0S1YGyUyKJdJg2dJJrpTGCLkmT50LoAT2OQaax3Hhr61 JTpidVBRaK3r
0B5PALujbwfugaPN9/tvGQBEIa9ujlwVU5jw5orO1CMAMl/0ywTmv5m954VF jnQJLILtgjc6
KJTdMg9tQELBnkAvtLf6A3AEHIe5eQND3H0FQ7qSY/uVw6kf7IcrAKCN9Hzi 7y882qVZX354
JULTRBSpnb4cW9ae/jVyjq1fkhslcrR23hGT/NWnD6Veu34ZgJ7G9TPfAJFL woIFgMDLBwBo
uCL7QHxwwcWEPV+tGQbA0ceiVcOZ/UDSY8FjHYGAOcvwkRbA9TMFAH7e81YF 2goA3xsa9LCH
8DvBZboBzevBT24q+hJIALCp5PTrwU/a3dSm7usE6ZotP83+8E9BBfL1E2aP tVGtZ5s1P24q
mPG3FAF0bcB9f1o4tXO/iUYb8ODjkXPMSszRU3CXJqxbmJzwWuwM4Gm7+/a+ NxQXd/yqXjPV
lJ0VZTnADPEQQHtLlo32J08HLg0b0lWiAaL2KxdNMalh0rAM1l6kBrNdC1wa bVaVnL1nLnvd
36h9TOt4br5d790sOvwZcM/W+PCtcPPwBw4cPjknujO3ssyLhfOtZenLlq56 cUvhA1P8Crac
NdV3tfrmkHiOlOBIwaUrbwWP4Vu3cnEdDpi+b6gWwDAUbUB4yOKoYbTuocXr RL59/Jr5TeDO
Xgc0CaErXg9+8tOzZw1pLiF0hT2tXIGbZEP7TbJVrWq92XUq0XKxqFqhAqDX 3tQA7qI+rOiM
NrVka0Pp4Vi/fyP82UcCDOU3VLUWfenonnefhA+/XTjjYmbhRdL2Gs0SwZSn wiGPeTu1QQsA
Svmu197Onv/JS163bNmAngbMkxFYkhFrsAAAuuFiSUOLTfFIy60C/jBf4CbZ /dcYXDxH3xMw
etyk0eMmjb4nYKRXV764fnRL4T0p+746u+Wrs1sy8hPS4y5/lmrYWbM1LxbO N13MAeKk0mAX
svoyAD1GTlsMJGd/U9IOurWhplVvCNnjodczPn4TCfODixW0dathY+4HYjMP 5VYW731jaSz+
5AIYTGVWqgR+UwL8xno7D8jl04B0isOMhNAVdia4TgRA5osTMg3//CllX9ps V4DHc1Kd2fTa
xmxDseTlrIcl7L8orGmoqm/VGTKFHk7eY8cLutuc8Xza5z9FjRwCaC36SjuQ dr8r4MTrdlwZ
eu/Whyj4tZ0JhS8W26zA0lz87E/lzn+ZvHL6WkP505uLwx+1+sFsM8ssgfSS /0TmlxmsA7EM
NiPKdKpLHVscpNurfDZQbN7c4gUA3AMAcBwrfVMW86JvZmjGgX+s6G2rrvFk TGZYelLnNXH3
+5+fj8m5P1atfsjmvFg4P/pPqySYHzF1k//CaOk9BW+sTT+QEZWxM2Xli0GH YgBIU37Kn8CD
K6CleH948dsE7ePxj6z88Cu2Vrvb09+bv9Ytbv3muPc/1+oBeM3L2J228nk/ g2Jn1H71oikD
blnHPeE/IPjhh8teXl4ikcjV1VUgEDg5OTk69nVRAtjxhL9eS2puUnARDh1i 8xTs6jfrkj4/
6+0mahuqJq8F/l/mJ35DbNX9HdCoVXrQji6eAlv3cJgY4IG0aynw+M79med+ oac0FARD+NCT
GlpgvHaspzSUznmI0KYXVq00NynD9uKFzNA38p4/kGHK1HpKQ+kc+UJDRAPt CX8u0w0IfrNM
x8FxS+irtkgm5Bj/ka7/OnvWOPbl20DLdNzZKwcHh904jn+lRB3RQuppCLx9 etsNGEBwmY6D
g6MPOLoIh3kNuG24XuEy3V3FQDtl4OAYIHB3mXBwcNz9cJlukMFpDnNw9APu 7HWQwWkOc3D0
A25NN1jh0hwHh/1wmW6Qceuaw2RjY2OjirL55NJAh1Q1KhSN5EDUyxjcDPYD o2e4TDfI6F1z
mCoJI4j0UtK8REYQaaWtoKo2hxEiLy8vL3eBU2hJY2kYYUVgqorNZoRZldCI xPwqkqU8tYS1
xNR7SQRBROzqUgZODQ07TprcO13E7kxncwBkxeYwQuTu5evrJRIQ6/eW0Gbu sVi2jII13r9/
EkoQUQdMmZM+vI4g1ud2CyQw4kBJI0to9nArQ2e0UBFFEIGJx81thhKhRaYA ydJUIjCdtJ56
9nhZ57f7gUF2HTNkSaqFgfQSsm9DQRVKCOI4i5L1LdB+dcfGjZv2nzMrqUzb 2MVHafvPKDTm
5VymG+ikFn31yO63Htn9VmrRVwAKHSW9NlEDWh1tVaJTnNwRmx1dqWEYnbq8 OMVfPHmPUqlU
qtXVeVJIcqqVaqVSeTSS9WlYEkjIqdSoldWVhfPI+LkTZucraPNypVKZHSlh LTH0brCTuVJy
oMpyPaYGtA7jbDljaq7YPHtyrDqpUq1jGKb6WNqm5UFvHe56wofVcjf4rPFG /zklA9uXbi9S
AVAVfSxLlhXHzTMGklepVlZmzMhcGpTRyBaaPdzK0AFQHN29HZDHby/pITi5 tmskO6eePV6W
+bU8MASdpnRCSaRSqVQqlRp1dYoUQPRDU4S2XLUx7Pf+u7j8XlsPH9IVYQSR Xtq3JXpz6fFr
QHvZicr2rsJ2YMrCl+Ni3lj18rLx7WXZnyWfadYby2Uvc5luQHN7NYc1ymag SaGkwRNOmh4g
5vGEYrFYLBR6uwEeYnexUCwWi9kPSTUwzMuLLxSPHR8cc6gyGvL3DsgN5V5+ Y/kGQ3wea0kn
hsXG0ic/ULD00IszZOnXsXJJ3r6Y8UIegLEhUcUp0mRZuqJ3y710IQwIz4nG 2hlbFFRVwozY
6Jyt04WmkD29hOLxCxZHA1XNVE+h9cCtDZ3qQOwmWUKSDJl7vuvrg5v2zq/V gWFugy8Wi8Vi
cX1B8toCZJUnTOLDhqsGWtOkREqJ2RKOurb7zfRrNEBVrAtddzh/r2Gluflw FUAdeG1yNrBK
IgiM2mu9CrcBeeq7S+IpgWLUn/ylvrNUBwiGiZ0FQm+fSWFrXvZHe96py53l XKYb0NxezeHx
C2OSpJkP+jpFbT6s6M92TJe2bUSKtGDHCRUgAlb95a3ExPXr1qcbVlQiYF/6 1r27dqWnW/ai
RnhheZ5UHv9qap+VgWuLc4CX/ujZVTJFugwovEreqmWANy/+mBTxvoIJyeEZ CfOMmsMioKVR
qao5/v78ZEQumMBnCdZu+jl0VEX2Wrk0MS4mLkGSvCGb5cTzdtDrgUHXHPaT JYdnyJ+bZHw6
wvZQ8Ock5D02qpv88qmjZ27SgK7tckGybG7OmuoG+f7oWNlBFfhh7+ZJgISc 8hMfPmnngxft
V38qbh/6xJNhj05xvpz/c/f82Om9zwNBQ1tLK0jACdC0qLm7TAY0t1lzmD8+ Jl/z8OHtK2Uy
39jIYmX6dHbdJvvwFxmOnvDQWXPudb+JIe6dmsMCwBlsUiO1ThNCM7OjfWVB h2W1IlEfHirS
aQFJD3dF9d8yAIhDtmZFTl5emJO0orOlEIif6xcPRCZl176xiEeXwCLYfmP3 0J3cvRKyNA8N
6TprOeLX5lREPjfJclFmU+7KfqwPjG5fFopNfjLI0lJXBJiX2hgK3qQQG/LL TlADObV7Qn1A
qf0B8ACeu5s/MMzLVyg0k19WFO088AucDf+0i4IWPzdrdOe7ZcdPQBwsatdo J05GWXHJ1Ucf
Gu3M3uMQAQ9wBsqy07hMN6C5E5rD0xetOaueHSEK2lO0fvq8fmoOH1hbIMtI EUKnBuZLF4YE
dCkMq4Flz0Y+F8CuOazTwGdRQkZ4smxRrAyIs7tvv/tDId9xRrUmxJSdLxXn ADNGCAHqliwb
7U+fDlwyf6CTBFKKlWumd2kOWwbbB/o1dGRR6iZAsnX+7K3w8JAASbtPPvd+ KHQACs7UUsGT
+ADqL5yHdDpbX32i+4Exp+uN45vD4yErzIgy/1rs71BIDSOs6yzQQW1VyXn4 HxY84QWDvh5N
O4qGd72nqTh2CXD+ZXvyL3B2dgZOHi976Llpprc7Y6//qbhVPHucAPp2IGj5 GzwAqirhZzuG
VEG3PqF57P9U6qOdD2e6Tgu/MWagRm3Q4Pz09Ndqvc5+zWER0HKjgSKhoWnw BGLTl35jaVGd
6J6AsWKaukkCAeI+aA4bbVLQKKv3xEo2Ibx4SQBQIgIaGmsp0su8L61OY9Ld ZkW4IrXwkPuM
bMji7XZAOP2pBKx9cGVq9RdrxvKhKNolWZkduf+j7qm6P5YNGC6Z6MxKrD+B lsEK7fqc93vo
qr7eki1JUZ5dY0gxitz1vvNTS+JCpws9AoGc704+NylUiMYfs7dLwuRC8746 p94+D9kOjGbj
W0WpD8YWhGcU3oNGhUIHOLl7efJ7Ggr6SqkcoyRjxOwfKp3F/4JhE4GWGyRg 9iXj7Dba3421
ueKnoyrnoDfiFhpqNxfv3XLkWKVm2gRHOAGaVlV7O7Rk3Q/7d1+C9/IH/IFK Q48OgPMHE8RZ
oB+6h2k67UUQXrb2AlpL2N6lhkqIMfZfQqZKhxPEGIu/0M39F0gsTfMlpB79 vIRNOctWihQD
+86shNAVNTEHVXGH7VceFgLxcycIRCJ3d3d32XbDlpCLk1PdyU0SP3eCIJy8 HlTHZa0MZj93
JRVVpRVGSiuqSNrMpkDk7ivJH55Wqd5j2Lbv3tc/SWNf3Y5yQ+/d+hAHb81L 6KkCS3OfDery
JKz1ExAEQfjOWBmXVfzpU1aaw2aWWQPpEZGrmRfWgVgEe93K/m0dusaDyzOj k57qnCSfOc9H
Ijv9P1XA2Hh5lnrtXBFBEITXcnncvpUBbB5uZ/0sWzvJemAYhv3qmXwAmStn uLt7+fr6+vp6
bZeTrM6boL6QBO260G33TGT1AgAMF2x5Y8OTZPFzfYmwXXZckbjx09F6/0dn diZFj4CQUVD9
UKKA8Sz1s02bNn+8ZfevrsEvx6yaIAAAJ4DnyCMYXUOYk0ec5lowH6CcSy8R kwO07Nm4811a
EObkOV9+LSqgA3CsKHH2lmhsZHBrHFQqB/A61Gc8/R5EtbpJRBPg6cXCnn64 vgdK00ZJtlKk
vIn195h7gRoiFYg3kddm9Kfx7eR2KXH2Ck2RJEmBL+zh275i77plSWf9PURq kbr5cmDmiU8C
BpJID6lS0aB5As9e1yt3OhBr+05f/5ZDRzU2KgGB2NPuDx8AG8Niz4Fx56Ao Cjy+3Vez+0VW
OAMwABOe1qi5RC6KJEmmhtE0REu12XmkDAzAJGXXM0yN6d2r+yONTSSRpFrT EDenXa6pYZga
XW1znNTwlj7jWB1jw47hTyNvA9rUhn8blDLQObVXGKaGYa5lReoT8q6XZ2kj U9RpkR0AA5m2
uOEKw9QwujpjiaS9sOEKw9TIt+kRcJNkajTlpCz8Zk6WFmAg0RZWNiVIGYCR JdxQGz1p35/d
JgEDMHFZTTqmhtE0zYH+FFnT6dXv9Xf06NGysrJr164plUqNRkPTNMPBwXH7 cHjyvRYJmJzK
61uf09Bqx8PbHQFA53C5wFk2l7+m+rp8f3usTKQCTO92hL17QwIk5DSe+PCG EA6njjrepAG4
xPu6F867oWau1B7TrnzQ+3ANwWrHQLfTdc+2+VLH2MwhAOga0fLtePT+dh3p uH2tsGGBUtnQ
mKR2DnrDjQaR+5b3KldSx1yRryNmvCw2P+/U6RyyM11jf26vVTYkeTjPmOAx bGNDbfHN7HhR
GWmIyGnpTiKj9np5DrVpucehKu4OGw6O/xV4fG/aA4zYVyfko7Vzk8J4PVgR 6gNKrYfhkobp
XZ673h8Y5tUuFHag8yGaGtdNYApfUQsBYYgyTeK780f+oifZ7LCgf/Id7aq5 oqqYVkW6ENE3
goUo1RKSpOYNi24CWPlOe+xcHpnh8p9kQCqIX89vLuMhm9f9t/YIQHv0E6UY eDiMkcxTrgmh
QDlIITBFxBR+0TCdD/jciMOIX1sc4MvmCwcHx12HKfPorK+VdVheD+6E7cIw TRMA07Wf6wG0
E73YMcPzQXUkPLekD7+8CVmVrcb6fOPmnc7smY/wZTdfeohu02HdR7TlHoik wxCPEzp3/Qiz
tzvdIzQA+6UdDg6Ou5HuZ3C6Hv4z+1+gnwi03Oi2Zc4ffzMSDp8cHAJAVTps VQGeDqEs2vUE
TxOVok9e5ZotbZs/vgOAkwsj3yEsbSQA3ndZzojTinnax6KRuc+F59cWEKDx FnVYuifvemmN
CA4HjrjSgKpkaDIgGW35c8McHBx3K90znRNgugua5Xpw57s8bXiSPn7uCCLM g+yqqf2wXF27
0oMgxrhLhsbtb3pufAe7HRv/Tn+WlABxMWqzex944V6jCcJnZa22Ml4NMPM+ qE/zFfgJxhDE
aPdlbhoAYODBGN0zGXQCPNiuIJVlejgRY9yDhiRkN8zzZCzdGwxwmsMcHP2g /7/3SlEO4HVY
XRgmSNLBSaDvxwVjssRTFORUrlNM4gFASeqolVCeXaNRqRzE4m7rL4p01IER CjvYDbG7OyRU
IP5Qc02ic9Q46X+PK+k9Yf9dJp1Sw5zmMAeH/fAIYszv7UM3JjuZ+zOcWHs7 jQcJbAbLMFdu
Z093Hi7NcXDYD2/gfMIp0pEn1HetBWkHkmaE/H7eUdy7/cGJQXPY8GLY3Bn9 sEA2NlLgCcXi
O3uj5h2DVDWSGgjde79zmOPuR99cdLTSb06wd2832g+ge8r4FmmI13Eb0xyL /cEJpzk8uDWH
U0tYJ4h9GEO75oJW5AYSRFg6+wizhG//5Ha5MSDEgTdu3LhxU9qPlTfss9+Y eyJX1d57RQeA
KDnsXqQYACmPdj68y+3KIJGxp0n+3s0joqJG5Nfc2aHjNIfvGs3h7gNC91yH BFCwNq/GWE1+
IE0OQMtemSV8uwWHzZoMCHHgmDdenu1V/33WUbtSnSNvKOx6ltMBcPheNvS7 q7fn49paOpwg
fHuSge6B2/S8PWnlA7s2gRWlu3zMdAdGrd8l7OGR42PxXsuz8MhDOtzsUeOA XQHBMYUYk1DY
+xKT0xzuajuYNYd7bWWrztbsYgBA1Z612VKJzcps4fc6uQNUHFgg9Ama5g80 k5r6Q6mbDIu8
HbnnDBclmyt+SDUu/NIquz05QObt2JR66Jxez9Kq/kwuDwBfclvU/Doh2vu3 LuMxc9CXy6lm
0BUeTpP5ck2tSS+L0JndCz10yg25nGB91Lpil+/k3ZQmv5kPQEsA2kp1k4jk /Xp62AyZ+Jur
RPEGVrVSh3P5SMpoeGp6B+D472Kdt61vQr7m38WN3nwADrvCRu2e35Qf1Qbo l5Y30d6939DX
qTkMoO5wzP3pr/z8xrZ+qA0bGL8wJkk64UHfzMik7HffWOTT55P5bsK5yTtO qCJnG7RnG4IE
Ss3Y1fFR403CucJAEal1f+KlRT5m7dUILyxfGTd57qupCw6tmdKnvm1oDu+7 SsLH6ZYsGzWH
kx/0FcQjPENtqTl85v35yYjM7tQc7grWvo1C6yGyr44sI8N/5covatYEuxcd TJam5CzLj21h
r9yv8PlzEvJgJQ68iAaYtssFyckF4XnVDYk/vy+RHXyZiQl7N0+yfe5TOeXR s/z6JA78/JNh
WpTvy/+ZDF5o1rCbOHBWaQX56CSDODBZX3X4yGWMmufjzGsJDX/83tHayiMf Z+VfDr13Alm0
Zd/RUbOXvRwyTkuSLs6AHoCTi2N70Y6PT9wIWvvSvY765gndW/mTRWnZRZ1L OQZAya6RRJin
AqBrhkUEGpc26ccNep4O+akjCWIMETgqLHR01C5XAKBd0qNGE8QYInBkUWPX 0wjOAFXhHhYx
PHfvCIIYQwSOKKoakhg6hiDGhCUOIwHA8UCU7+YD4nXEGIIYE7bevdFmcrSj X1rw1uQhgKNE
MMZYoXvqpq4NfWfLEAoAKdgcMZogxhCETwkJqsp98kpHFAwREKN3lToCBCR6 L6He00cbvKih
OrtdHi8qJgE4HE8fSRBjCGJ0epETgNJd3mvliA0aFRjhQVLOu990u0YDcNwb 5ZuaOywxzCxS
07tVB7xXZqNg1XAicEQp5XAy3S3/mgMA0M5719l8Kq1SWTvCxbg4H+EytFJZ a6umXfDHx+Rr
irNTCmNlvk5RJbeo1W0unDvr4ccentalPWsQzmURHTYqA2evDTpco7wTmsP9 sAwYNYcBibXm
sLvfg21J2bWfLrIZrB3Y08qijhqQPBoRjuTcUsWPO2Oj33nKz0Vt22A/wudN Cgmd5MXmUKc4
8FjPiX/wB/g9iAOnpaYZSU3d++NVczNlx09APFXUrhFNnIz24pKrtrfTzMSB P047qAuct3pF
sKOjx+RR+CXvSN4vSgC0HoqKc8Co+XMnCZyd3Tw8BI4GZ1X/2flRbsOU1W8u dANg1aq+4hcg
0Bgn3xU1h0cErXQ81nDdB6CddJGZdXsC2ktSRwWtFj13tonM9Zq71jGvuvZB d6ePZV65agLG
5+3VOuZG+S4fyctizSFlp+eG5+0vD2+tVd7IXOI1Y4JHyrGG2g+H+AaJyqJb goVorneMXeqa
La9b7yRYNnnYG9Pb9ixkGQGFff2+ladNnuucU1k3y5fGJVcLI7Ta8fB2IB2K H4fFZuqqmTpv
lZNOAP74G3kJQ+bGt5crm/yE+ksnu7Ua+ygphUfRJd7ohuEPrmKqdVfcyz1E Es+HdIqAZ5QJ
n3hrkhriZumE4J866riIBgCy3nHt/GEpxxoa/i7wmiwqi24JdnIwvBsQpkyQ eB94quX76FYx
n8jP42kjDLGMWH5GczSM/QDgNIc7Gbyaw9ZDBMBigtjqqJ28pq+Mk8yVzAdk 8nQfpPZk8BbD
t+J3EwdeOME4B2Rl7sdZRYHzlv1pXEt52QlTfSerq6zOIpG4vv5KpaLdw8fZ upUL39XYn4sH
9n3ivXa7Q07ttRBPAOD5tE1SC3elDrt6GfAA4HAyy1mSpAwdqwf0i5Z1ZLUA NMvz9mYrqR6f
twdwGUnFdYsC9ED7O9HD1v3KA6yvtNrbr9BTDzBevjohHyybCCa33Ce2A0MX RYxIilHOCwDQ
4enVAYneV6xnOXh1ACByIk5+5Qx0JMePwFUngGjRAELaC2jx0gmFephvLF5G dE7dmpB2UI5S
i3B49GgPeAyjPYV6wDRZtMtXyUg6pYLWunuA0xw2bzOYNYcthsh6gliHsY3G A8++ik2rEJ0U
AJTaNtiv8AeoOHAnTTUXgYkhwZNw7kg7ABo+k6bh+yP/+aHymYf8tc1NcPMW Ajo4z1z28vSv
k/d99hFvVYy7VSu3kWOBo8azV1+PDsDh59PGmStJ9/WaLHQPbg2T0mgmAGao WbJua+k6UQ1f
dvOl59WrE5vKK2/06Xl7LcB3MpbbXtTa3y8B9P6ELX+8UtfQGBtAzJeMWHfY BYBOS9iqrPhR
WAB90ES9MwAZ9eJLLS/GNMvLG6YIjP53lw8wFo70srn7xpbNiDbAxbmnm2k4 zeG7RHPYbIis
J4hdwlcHfsDTx7Kz5evnGAoMzzja1vu1HNgeGaDiwJ0mxtw7aygubdm4cfsJ pbdz677tuRqP
oFWyoMtHszZtfO/jLZn17cZW2nbHSWGvL5zifCTtM42/Zat2n4dWLZkNhrmW ImFSyq8qCzUA
k5BTxzDX0qQMom8wzNVjKTQkbUqmpnJ/O9CRltecl6UFGGlaE8NcyYlmIG2r 1tQwzBVlQ62O
qSHlNwH9KbJGXdwltFmcopckNTFMDaNpkkJfqK4xdCGJUzfoahhlUziYuLzr ZrqYVwv3t6Xs
b9bZ3a+uUg105NVeYZgatfwm0JFTXatR1yqVtWrNFbK4DWgjmRplZWOl8oqx 96QmxmifqmVq
GKZGnkYDVKX6qlpdK89pA5jwjCaGqanN0QJ0XvU1hqnRKGvVuhrDoCUV1zLd 5Dy7FRojNQtq
fziDBJWOqWGYa8kBhppXsiMZhLf+ZkqcOo1a2dCgVGt6qFOeFS2RSGVSmVQm lUii5eo75Es/
USuVSmVDjxEYudOBWNsf4EN362g0Go3uN+yP1ra1aRmGYei2Ni1tVtjW0yfE qlVbmxaGj73h
81mdQwFMSqHC8AJgwqO1EmN+uXYsTSsBI42+mZVgyly6ujSTZDGkN9XGTEcX kzVqeRskxkwn
T9FLU6wynYyRyGhDW2lCi5qpYTRNi0wpI01qNGhnvwxzPUXGAIwsrVEtv2l8 y2A8pYmUtyGg
jWRq5Bk6U7nOkBZ1tSqDHnKa/Jo8TWfWkE7L61RIvnospb2zvNjgv1lSM3fb OtOZ3q2pzdOY
LFzbNsdUk2zYOIfhNIc5OO4UdO3nf/2rzSf8acpRA72QD5p0pAV6Ps+BpDqE fAC81FCfQ8sM
d0sA/XveHo6pgb7IrF0zGSoNI+6pbR/6pUgHnrCjl2titAOpIQTdnpdwICkI +b34T1OOGh0E
t/igBeVAgeFbPfvxm/2OBAfH/yD6dg3Bdh2A47fm6NEfuEzHwXHn6MMT/hTJ U5IOOjC+Prpb
f4CUphxpnl3iTre334HJDz/83h5wcNzV9CF18IW0z+37STce397TwNvbLwcH x/8gA+DBfo6+
wGkOc3D0g7v1dPCupfzRSE5zmIOjr3BrusEKl+Y4OOyHy3SDDIPRoDLjAAAZ TklEQVTm8K2c
vZKNjY2NKmqQ6ABaQ6oaFYpG8pbVvTgGHPrmoryi+jvzm31cphtkcJrDg1Fz 2KZvVEUUQQQm
HrccajvVhnvq924WEO4HXKYb6HCaw4Ndc7gH3xRHd28H5PHbzYVj+6o2bCPY u1lAuB9wVyQG
NAbN4aV+IwHsOfPdmuDFBs1hAP3VHG5TKOnxPsJJ0wMAQCwGAIFJltb23Twm zWHhWGFwzKHK
68SE9w7IQyM79W95xs8UxVLSSac0bu3ZDT4WHYAnZHXG1NyoOdwQM14IGDWH 9wXJ0t9i3vfp
xXJvXYjDc6JXzp+x5SnNcx/MiI3OqZ0uNAYyzNNLKBYuWByN7VXN1MOWodmH bd9UB2I3yRKS
EB+757v3pi/qJsuyNbv4qTXBNtSGrR1oTZMKtR+Ra6ebMgV1bfeb6c/mfCKm K9Y9ni595/6d
c5dnA0nZlTGLfA0CwtkSwdbIrBPpz9l3E5dRQBhlZ0/+Uj8h2NtQahIQFngL JoWteVm98bO8
U5enPdopICwImuZ/4lozqak/+tnOs6p2AKOCl6yYd68j0FzxQ9a+oyoA8F4e s2pC183yZN6O
Lec9nnjtCc+vP7VsVX8md2d2UTucxWJn3ZD7Xn3pIQFQfy5358GidmDU7GUr 5k6yvu2eW9MN
aDo1h2Meiw8ZKbw//ZWRb7xgOHvth/Lw+IUxSdLMB32dojYfVvRnn66b5nDB jhMqk/5tYuL6
devTDasWg+bw3l270tMte1EjvLA8TyqPfzW1BJ36XfZhQ3O48Cp5q5aNmsOI 9xVMSA7PSLDU
HD7+/vxkRC7o1Bw2D9YebPlGVWSvlUsT42LiEiTJG7LNNg1kGRnRBWu/qAHI ooPJ0pSYV2WX
TWNrwwH+nIS8x6wEhG/SgK7tckGybG7OmuoG+f7oWNlBFfhh7+ZJgISc8hMf PtknAeEnngx7
dIrz5fyfu+8NdBMQbi2tIAGTgPC5w0cuY9S9Ps68CaHhce+++8byoGtF+Zfb geaiLfuODpm9
LCYubu3qpb4Gwd8uAeGA58PudYRlK31zUVp20WTZqnfeWT1rDFobSABoLko7 WBS66p13Y57X
ndh3VMFyAsyt6QY0lcrapX73GV6PcBlaqay4JXP88TH5mocPb18pk/nGRhYr 06f39AMqvWGu
OXyv+00MceeZjnmD5jBLG6M0rq8s6LCs9k5oDvfDMmDUHJ68vNBaczgeiEzK rn1jEY8ugUWw
9sLu28ndKyFL89CQrrOWI35tTkXkc5P46FIbDsotfWvsztjod2r9rhzqtGXD Ad6kkFD2zjsF
hH1Aqf0B9CAgvPPALzBknPZ2UdDi52aN7ny37PgJiINF7RrtxMkoKy65+uhD o53ZezQTEC4D
RgXOW/1EsKMjJo9qO5135LrSSkAYEHh4AIDeKCBcr5qyOq5TQLhbK4OA8Nxp 3o5AQNDUI2dp
AIqKCwDO/SerCrp6wEOthY+lb1ymG9BwmsOdDF7NYXbfyKLUTYBk6/zZW+Hh IQGSdp987n1D
trJbbdhe7kYBYQBayvRSB3gHhUiH6emZITzRCEvVcXBnrwOchNAVrwc/+enZ s4Y010fNYVKl
UqnMbsdoLC0qrVEBMGgOj+yP5jCpUpSmRvhtQnj8kgB06d9260ur0/RoTLgi tVAmz8yWk/b/
UpNw+lMJkD+4MrWGAtCpOfySteZwXy0b6IvmsOXA2kc336q+3pItSVGePXv2 7Nmz+fk5OXHy
TaklpnNCo9ow5IheFWDmlW0H6CulJVdUNrckbAsIm+HsNtrff7QBf38fj64T bZOAcFxcXFzc
m29GLpzYfumY4ae5TALCGrL58pG0tEvwfvwBf+seOwWEXW42dgkI4/J/fqhs h55srif1Bj+d
Zy57eVkgcj/7qLheb93KbeRY4Oz+vOLKcz98lHUWQ3mAwVR9dYuz/wR/f183 ZzZxDG5NN9BJ
CF1hv9qwAYMmrVFfW5qi/HZ2l+bwqmxjcY+aw9VqnSFT6ODkN2G8sLtNWXRa pTpqvBCgLPpK
U397v/2aw9lzi21WYGku3qAud4mY7CdYayiPyypOsKE5bLDMEkgvx7tdmsOd wSoyH27qbh8N
LEPH5lvjweWZ0TlJnRPgM+f5SExO/09V+kJjY37A08eyR7rNnGOoYK423DXa +VEm+9QXkiDq
lDJ+Rtec9iog/OBc33hZhvrQit5O9W/8dLTef+HSbgLCR3b+UKKYcL9RQLgs GwDE/sEvx8zz
EQDtbALCJ45s2bjR2dvfIAUc8+a8VbLradlZm44CGLo85k2ho5mAsO4fR9I+ WxrB1moJve/r
I1nOEx+eM/H7kzQNwCNo1ZLGtINpZ7MBIGh5zMIJlnu1NvXpOH5LfjN9Opoi SZICX9jDbyBU
7F23LOmsv4dILVI3Xw7MPPFJwEBSWCBVKho0T+DZ66843OlArO07fT2gh84C iqLA49v9u7W3
jL5d0w6BwBl6jUbvLDAsvfTtmna9s0Bg83C3aqXRtAsEzgAqjny078K0mDfn Crpq6h1Nhi3g
Mt2AgFPi5OCwC71ix3ufXTP+M/ThF1+dNdquS+3c2SsHB8fgwdFnRVwMSbbp abgO97C9FLSE
y3QcHByDCUdngZtHX2+Z5K69cnBw/A/AZToODo67Hy7TDTI4zWEOjn7A7dMN MjjNYQ6OfsCt
6QYrXJrj4LAfLtMNMjjNYU5z+LZAqRoVjY0q0vJAuFuHl8t0gwxOc3hAaw7b MyDGmt3Vhtl9
S1VRJaFEaJEpFrI0lQhMJy06Cow6UKpi750VsiI1ghC4e/l6ebmLBE5EmPF5 W9vD24MPlsNu
/0HVNWi/hTwyl+kGOpzm8ODSHLZnQGCtNszuG9tcyLVdHeVVqhvkKf7bl679 N2mjdysUiaLJ
a+Vx8gYNwzAadUPxsbgRAvQ6vKw+sAy7/YF0Nfkt5JG5TDegMWgOP+ItfMRb uOfMdwAMmsOF
jpL+ag43KZQ0eMJJ0wPEPJ5QLBaLhUJvkwavWCwWsx9xJs1h8djxwTGHKqMh f++AHF0quGKx
WCzk81hLOulU31Ww9NCLM0bN4X0xhsf0x4ZEFadIk2Xpit4t99KFMCA8Jxpr Z2xRUFUJM2Kj
c7ZOF5pC9vQSiscvWBwNVDVTPYVmPlB2DIhRbViGzD3f1dgTPntHnr5CzwDp AxIUaGkbvVtA
ln4dD+R8/36A5/+3d/5BTd55Hn9ngMjjmtTAgm1wT6l0BrsSHDgPa9Ur4DhQ FdhtXWf9sSvb
ET2vB6i3YXJTcUp3dOiOXWBdN+CoPTWdcqs7DTKLOgW1tWxTDyqhFbyDUXua NmYhNY9rQkiG
+yMEyJM8DwFEnsDn9Rc+eb7f7+fzxXn7TZ7Jy0gAkbKYlFVpyvBRtpePQNs+ aiOPtOmSytYR
RzjHvVP7qu+5AEfnnow9dU0feE6F79Z1Aw6PHnmXikne+YH/MZ2vLo8eWQFz 85fmwbKCHUtM
BUPOYQDf1amXVf/L9b1/HIdt2MOi9ery9ITVcWcKyvUH9uYox/zL93EOVxy/ Zi1Y6bHgPkhl
eu0L3izducjrHJYly9m+qA1v5Iz0iduw9fOOfM3izN1V6z4qfHFMa/M4h2v/ j4UyYkIzDzqH
K1bHMaXYetLGdQ7fOJhdgQL9kHN4uNlAQeTfvv8oj23Y2KJ+DN3y/frSnMJx GFHlQGf79VZL
d1mJsUCXrvBeFK7wTksDUJkWw70uvL18jGvbI18pa4SfHjnHBQw8vn25ouLy 1sY7D965flCV
e27HgDrvQKOqJvP1ho7ilxeOSY/8i5/m9aGjtuk6m7ZeRkkncsg5PEQoOYf9 2ueM4rMNjwon
cyrKD1QYL6O4YWBzEt9aXPq84iZfRttevhrGse1To0empBM15BweIlScw/7t c0cJ2Yb96Adw
+cZ9R1piJADzra+RnjK0kPbPl3758CiTmv3+r2zbk2QIQkq8cFkGjEUGU2GW 0v86z/ayvDVg
wtvux2TpkelzOlFDzuHhMaHjHOa0zxklbBvmIotOBhouNbMAYPlMX6PKWzGU xn0P7ZEphY0a
Vb5qt2eGUSuUqdZpgOzsPQYTC8DBWj6tq+t2CG6vYA2eWcey7VOjR6akEztl Gdvvqs9ZNXXB
m4c9ZlpGLo+KiorKrbF6tb3fNR9SLYySSCQRsattgs7h9s5B2ju7WdeIORl5 VJyq6YfaLttp
z8f2vmv9JxtI1cvnHBa6IcBw5X5bRzmKFjISiUQStzxfo2v5A49zWKARQYJy Dg81+22g+Ucb
deSDLWeKy1/3tQ3rqy9285S0oNSosxVlyiUSiSR2i1FTm580ojwAyCj7swZn Uv/9rCOYCsMX
Hew1lsVXLI+TSyQSRh67ev/n/YDg9vLWEHDbR8PxoSr1/Vs+yTWqHrk0M06S 934QTyS+/+KK
OX7tSz56ZFivtprIxCkKyDkcPGJ2Dk/aRjksll6AUcQoxvR5k0CFrNXicCHc 728C//aOs4Yn
wsT1yJR0ooCcwwQxqdC7V4Igpj+UdARBTH8o6QiCmP5Q0hEEMf2hpAsxyDlM EOOAviMRYpBz
mCDGAZ3pQhWKOYIIHkq6EGMizmEBnex0Nc1OJe4eQ6PB7J7qMggAlHQhx3ic w+DXyQq85C/d
5S40+Qrf4bWehpYWzi7t28Mc1v7phsnOvX5I+1nX98HNb7lw7YLVOfqNxFOA kk7sPAnnsIBO
Vsg06y/d9eGpKHy9az0NLS0AJ/Di+h0a9d5dOzYtct7UH6u40eMevJ67Q713 x8pY88e6K0FF
XVj4HMwZU0nE5EFPJESNxzm8ceFzAE7fuFSY9hOPcxhA8M7hQZ3sA/UiGTCo k61Nza3+9cBB
Gf9LymHprmzdT4pR093jQIxP1oTLFAoAYLx2Wc93KhVbG4rzs5cfed2++bfL S4ob7qfIAIf/
bGu8gtxwvwR7pE2X9R1mi1K8SeG4d2pf9c8bfqdwde55tTr9rWUnMrfogXJ9 lzonzqOl1auY
owW6a9Wbg/vu6aCWFjfbmr80J6TN81ztB5hnFFKGmcck5hXusL19rPGvt5eu HbzOyJjUpfHX
7vWwdvOVYyfarE4A89Ne2561JAzo6byqq71iBYB5W9S7Eoa/zsc2Hj/ydfSG f90Qc/4P3FHm
GxdO6A1OSBUKaf8P/nH3G//MAOavLpw4Z3AC81du2p6ZSF8MnDiUdKLmiTiH BXSyzwiaZv2l
u8ExcYXv1GhpvQwdh5UrUufo2jvZtYkRgP2hjTV319XfxvwspTT8YcbWV5f8 qK+r/j1d0+2M
JQms4UjtlfkrN+1Y9Xwfy86SAm4AEbPCnIbj7137PrXojSVh7p4E31HxrEGr NyTn7tqQNPvG
+Zr6DhYAegzac4asXW+lyb/RvnvqymJNplIa5NYTfFDSiZon4hwW0MkKm2a5 0t3gl5yowndq
tLSBV/wBEw5IgZt67U1gfnLWmxvSwsKweP7j/26s/7a3F4DLDVPnV8D87MxE BmCiowHAjQhY
L544bLa++KZm/VwAYdGcUebOL4HkzKXzwoCk1B/Xt7kAmDpvAfjqoq4b/WYg 2tYHSroJQ0kn
ap6Ic1hAJxslKPLlSnfHwpNS+AZisrS03peHts78RcsjxcrnGbidQOqWvesT Bvthuy68pzMk
Z236p+cfdty85r0/wu9tplQuV5jN33SZnNFKqf+oWZGzh9frc3h/7Afmpa5K f8btemlVuPzZ
2WPcHyIA9ERC1DwR57CATlZY5OsfH8EzMYXv1GhpAUQA9kdWp9PO9tyu12r/ F/NeXRHvv+Lf
7v4P8MKqtMRZf7c4AbigTFwK3L54tcsJN9tjZt2eOqUvbdqxKRkXjh1uMbv9 R819bgHQ9qfG
lq6vrh7WtWFOOOCZynznoTQ+IT4+bq6UPqV7EtCZTuyUZWwP3jbswSOeLfX8 Ib2yt6lwv61j
1rbFC5kizzWNrqVsUCer5H+Jq89lTd13bP0eKW8/IhYmeP7DPAGCUvh669Ta mnZ6j4COD1Wp
jr/2li5XjBzO+QHw0dKuzowrzT1p+2j7aB/Vff/FFXP8+o0+Wtr6E1dbTQnL PO9Sj93UA4Ai
Pm2HOkvJAE5EAOFhw8X/w5KX51yrP/L229J58fOkj2prLqj3Ze3K/Var1x26 AmDOFvU+WRgi
gD5nWGLev63v/3299tjGbYFGveaqPV+vk76w5pUXPm52uQBEp+56zaI9p23T A0DqFvX6BAbE
xCATpyh4OiZOAVtvMCJfkbuIJ66lHRtup90JhpHCbbe7pYzn6OV22p1uKcPw /vL8RtntToaR
AuisP1x7a6l6XyYzfKc7zDsxMUEo6UQBOYdnKG7T8d8cuzf4hzlrfrX75R/R 8W1SoHevBDF1
hCm3a9Qs+9jtwuwfRvMfBYmJQklHEFNJmJSZG03nuEmHnr0SBDH9oaQjCGL6 Q0kXYpBzmCDG
AX1OF2KQc5ggxgGd6UIVijmCCB5KuhCDnMMeHFaLyWKxsg7OV8ZCrpGpYeb5 kCnpQowZ6hz2
7aVqm4SJio2LjY2SMxGSvFZ2lEYyJBkG736w7VWS5GrW2+C299u981qrMvI+ tQRsqsoqUA/5
kEMBSjqxQ85hX0zvyBcXGTXGB/aBgQG77UHLJ5pnmVEa4WLsG/rxTL7qbPeI E2DgpgqEdC7k
Qw4F6ImEqJmpzmGhXkqBho8PJsUAQKQsJmVVjHCPSoHZAAAbf/rb+237vbfx NDUM+ZBD0odM
SSdqZqpzmJc7LQ1AZVoM97pAj8oI7s1D2LD18458zeLM3VXrPip8MbjuyIcc kj5kSjpRM1Od
w/z0eU1NY2lkJL65dz8iIeOMvjguN7Uu975cHkwWkQ85JH3IlHSihpzD3GmX ZcBYZDAVZin9
r/M0wgK4fOO+Iy0xEoD51tdITxka2G+HMqfs5NaK3JySXEAzjlZ9IB+ySKEn EqJmpjqHeZGp
1mmA7Ow9BhMLwMFaPq2r63YINiKLTgYaLjWzAGD5TF+jylvhe3iTba/6PNd4 Rm9k+d/pDkE+
5JD0IdOZTuzMHOew6cyav/nOjwf+Ky462Gtk8lXL4yoGZ1FpOtbmCDayoNSo e02VKS/y3n80
iVupIu1oY5k+s0W4HwDkQw5RHzKZOEUBOYcDzh9xnndF1mpxuBAeKVP4Vszf iMNi6QUYRYzi
6f/zTj7kKYeSThSQc5gQHdPLh0zvXgmCCMT08iFT0hEEEZjp5EOmZ68EQUx/ KOkIgpj+UNKF
GOQcJohxQJ/ThRjkHCaIcUBnulCFYo4ggoeSLsQg5zAA1mKxWKxc3TDx9Akd dzElXYgx053D
ju538yTy2NjY2CgmIqNVWBHs6NwpkSS/86lgwVVW/0o8VzKGVcMu04VkiSSv ujVA2eQuDgV3
MSWd2CHn8EhMzcdL9MVd9oGBfltHS2W8QkgRbLpyqgYwlta0OgQKLlAEqoQF cLmo8e7gNhrP
ao0A+rzb4lc2uYtFDj2REDXkHOZg7+0BHpt6XYuUssSUJADgVQRbz5Ycyi0r R2nJ6Uu/SclZ
wFuwA9xKvHlyVN/yemEa0H26SJ/ujWL/m8ldLH53MSWdqCHnMIdF69Xl6Qmr 484UlOsP7M1R
8v/9dXTqi4zpxhb1Y+iW79eX5hQKnKe4lQBA7smT8fn5H94tTIsynKtIr2zY 1FTyMPDN5C4W
v7uYkk7UkHOYS+QidZN9TV1Nfm5uXElBS281nye0+VQ+crXRdnb2y1tQWtTQ WbA5UShKfSpx
wQao1m7bitQL7b9ecKKk+K37C7/5iO9mcheL311MSSdqyDkciMiUnMI228pt 8tTThv9IyVoQ
4BbWUHUIUB3NXnkU0dEqoPxU8+aDPMkCv0pcAGwRsSn5GlWmKhvINVYrUSVw M7mLxe4upicS
ooacwxws7Yb2u1YALsffWeA5hTzgbd3nj+hVlb1tbW1tbW1NTQ0NGuOhqlY2 4L28lTx2YcXP
dwNGFO9KGtELf9nkLhavu5jOdGKHnMMjr3zXfEi1Sz84QqPLTwt43rSc23Km uKF86DXlK78o
wOLqi93V3tY4cCqx/WWZZ8nIpJ99on9u7kuveF6JjuS/2QO5i8XqLiYTpygg 53DA+QM6h10O
lmUd8LMNzwTIXTxuKOlEATmHiWmLONzF9O6VIIjJRBzuYko6giAmFzG4i+nZ K0EQ0x9KOoIg
pj+UdCEGOYcJYhzQ53QhBjmHCWIc0JkuVKGYI4jgoaQLMcg5LE4cVovJYrGy XBEybWxQTL67
mJIuxJhZzmE+G7D/qKD1whmSDIN3b9j2KklyNcttdufZdmvg1QPCdlZtkzBR sXGxsVFyJkKS
N/gFW/6NFaiB3MWTBCWd2JnhzuGANmD/UcHrhbkY+3yafWCsjK/ZWPRfLM/q fpjekS8uMmqM
D+wDAwN224OWTzTPMqNsLF8NIHfxpEFPJEQNOYf9Bb+BRo1BLyy0UEycLCYy fYUKJX2ugKsH
2ttSoOHjg0kxABApi0lZFSO850qeqQByF2Py3MWUdKKGnMNyoLb6qCxZzvZF bXgjR+mv/I0c
m16YDznQ2X691dJdVmIs0KUrvBeFK7zT0gBUpsVwrwvsuZLf6ETu4slzF1PS iRpyDgMAA0gx
a8QFzqix6oWH4GRORfmBCuNlFDcMbE7iW4tLn9eq5IvwxvLXQO7iyXIX/z+9 8DRGoSEYRwAA
AABJRU5ErkJggg==
--------------070004040406010505020800--
Re: EMF databinding Recipe [message #420268 is a reply to message #420259] Tue, 24 June 2008 16:59 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33141
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------070605010802020106090007
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

AJ,

Comments below.

AJ wrote:
> Hello, Ed,
>
> Please see my comments/answers below. Thanks!
>
>
> Ed Merks wrote:
>> AJ,
>>
>> Comments below.
>>
>> AJ wrote:
>>> Hi,
>>>
>>> I have a view implementation that displays my EMF model via this
>>> mechanism:
>>>
>>> treeViewer.setContentProvider(new
>>> AdapterFactoryContentProvider(adapterFactory));
>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>> AdapterFactoryLabelProvider(adapterFactory),
>>> new ADElementLabelDecorator()));
>>>
>>> However, now we would like to make use of the EMF databinding
>>> capability in 2.4 so I have tried to replace the above code with
>>> something similar to the one suggested in the EMF Recipes, as shown
>>> below:
>>>
>>> ObservableListTreeContentProvider provider = new
>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>
>
> Hum? For some reason, I don't have/see the Literal.
Maybe your model is huge and it's not generated in that case because you
can only have so many constants in an interface. What you have is fine,
it's just that a constant is a better faster.
>
>> This feature isn't really a list though...
>>> treeViewer.setContentProvider(provider);
>>> IObservableSet knownElements = provider.getKnownElements();
>>> IObservableMap[] observeMaps =
>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>> });
>>> ObservableMapLabelProvider labelProvider = new
>>> ObservableMapLabelProvider(observeMaps);
>>> treeViewer.setLabelProvider(labelProvider);
>>>
>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>
>>>
>>> But, I am getting this IllegalArgumentException: The feature
>>> 'mSLADL' is not a valid feature at the
>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>> is called.
>> Is it being called for a DocumentRoot instance?
>
> No, it was not. So, I have changed to this:
>
> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>
>
> However, it throws a ClassCastException at EObjectObservableList.
>
> java.lang.ClassCastException:
> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
> at
> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>
> at
> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>
Well, it's a single valued feature, so eGet won't return a list. It
sounds like you'd want observeValuoe.
>
>>>
>>> Although I have been using our best friend (the debugger) to trace
>>> the exception,
>> You've been reading the newsgroup a lot hey? :-P
>>> I would like to know first if anyone see any problems in the way I
>>> am setting up the treeviewer content and label providers for
>>> databinding. Unfortunately, the few examples available are using
>>> trableviewers instead of treeviewers.
>> What type of object is eOpenGet being called on. It will only work
>> for a document root instance...
>
> With the above change, eGet is now called instead of eOpenGet since
> the featureID value is 3.
That sounds like an improvement. You've just written it assuming a list
will come back when it's a single-valued feature (in the context of a
document root).
>
> public Object eGet(EStructuralFeature eFeature, boolean resolve,
> boolean coreType)
> {
> int featureID = eDerivedStructuralFeatureID(eFeature);
> if (featureID >= 0)
> {
> return eGet(featureID, resolve, coreType);
> }
> else
> {
> return eOpenGet(eFeature, resolve);
> }
> }
>
>>>
>>> Thanks in advance!
>>>
>
>
> ------------------------------------------------------------ ------------
>


--------------070605010802020106090007
Content-Type: multipart/related;
boundary="------------020301020504050706040505"


--------------020301020504050706040505
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
AJ,<br>
<br>
Comments below.<br>
<br>
AJ wrote:
<blockquote cite="mid:g3r4ia$954$1@build.eclipse.org" type="cite">Hello,
Ed,
<br>
<br>
Please see my comments/answers below. Thanks!
<br>
<br>
<br>
Ed Merks wrote:
<br>
<blockquote type="cite">AJ,
<br>
<br>
Comments below.
<br>
<br>
AJ wrote:
<br>
<blockquote type="cite">Hi,
<br>
<br>
I have a view implementation that displays my EMF model via this
mechanism:
<br>
<br>
treeViewer.setContentProvider(new
AdapterFactoryContentProvider(adapterFactory));
<br>
treeViewer.setLabelProvider(new DecoratingLabelProvider(new
AdapterFactoryLabelProvider(adapterFactory),
<br>
new ADElementLabelDecorator()));
<br>
<br>
However, now we would like to make use of the EMF databinding
capability in 2.4 so I have tried to replace the above code with
something similar to the one suggested in the EMF Recipes, as shown
below:
<br>
<br>
ObservableListTreeContentProvider provider = new
ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
<br>
</blockquote>
Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
<br>
</blockquote>
<br>
<br>
Hum? For some reason, I don't have/see the Literal.
<br>
</blockquote>
Maybe your model is huge and it's not generated in that case because
you can only have so many constants in an interface.


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: EMF databinding Recipe [message #420283 is a reply to message #420268] Tue, 24 June 2008 19:50 Go to previous messageGo to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
Ed,

Good point regarding the observeValue and the single-valued feature.
That did help, thanks!

Now, the hookListener is throwing a ClassCastException saying: Cannot
cast org.eclipse.emf.databinding.EObjectObservableValue to
org.eclipse.emf.ecore.EObject

protected void hookListener(Object domainElement)
{
((EObject)domainElement).eAdapters().add(elementListener);
}


So, I am not sure what I am missing at this point.


Thanks again Ed!



Ed Merks wrote:
> AJ,
>
> Comments below.
>
> AJ wrote:
>> Hello, Ed,
>>
>> Please see my comments/answers below. Thanks!
>>
>>
>> Ed Merks wrote:
>>> AJ,
>>>
>>> Comments below.
>>>
>>> AJ wrote:
>>>> Hi,
>>>>
>>>> I have a view implementation that displays my EMF model via this
>>>> mechanism:
>>>>
>>>> treeViewer.setContentProvider(new
>>>> AdapterFactoryContentProvider(adapterFactory));
>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>> new ADElementLabelDecorator()));
>>>>
>>>> However, now we would like to make use of the EMF databinding
>>>> capability in 2.4 so I have tried to replace the above code with
>>>> something similar to the one suggested in the EMF Recipes, as shown
>>>> below:
>>>>
>>>> ObservableListTreeContentProvider provider = new
>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>
>>
>> Hum? For some reason, I don't have/see the Literal.
> Maybe your model is huge and it's not generated in that case because you
> can only have so many constants in an interface. What you have is fine,
> it's just that a constant is a better faster.
>>
>>> This feature isn't really a list though...
>>>> treeViewer.setContentProvider(provider);
>>>> IObservableSet knownElements = provider.getKnownElements();
>>>> IObservableMap[] observeMaps =
>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>> });
>>>> ObservableMapLabelProvider labelProvider = new
>>>> ObservableMapLabelProvider(observeMaps);
>>>> treeViewer.setLabelProvider(labelProvider);
>>>>
>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>
>>>>
>>>> But, I am getting this IllegalArgumentException: The feature
>>>> 'mSLADL' is not a valid feature at the
>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>> is called.
>>> Is it being called for a DocumentRoot instance?
>>
>> No, it was not. So, I have changed to this:
>>
>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>
>>
>> However, it throws a ClassCastException at EObjectObservableList.
>>
>> java.lang.ClassCastException:
>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>> at
>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>
>> at
>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>
> Well, it's a single valued feature, so eGet won't return a list. It
> sounds like you'd want observeValuoe.
>>
>>>>
>>>> Although I have been using our best friend (the debugger) to trace
>>>> the exception,
>>> You've been reading the newsgroup a lot hey? :-P
>>>> I would like to know first if anyone see any problems in the way I
>>>> am setting up the treeviewer content and label providers for
>>>> databinding. Unfortunately, the few examples available are using
>>>> trableviewers instead of treeviewers.
>>> What type of object is eOpenGet being called on. It will only work
>>> for a document root instance...
>>
>> With the above change, eGet is now called instead of eOpenGet since
>> the featureID value is 3.
> That sounds like an improvement. You've just written it assuming a list
> will come back when it's a single-valued feature (in the context of a
> document root).
>>
>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>> boolean coreType)
>> {
>> int featureID = eDerivedStructuralFeatureID(eFeature);
>> if (featureID >= 0)
>> {
>> return eGet(featureID, resolve, coreType);
>> }
>> else
>> {
>> return eOpenGet(eFeature, resolve);
>> }
>> }
>>
>>>>
>>>> Thanks in advance!
>>>>
>>
>>
>> ------------------------------------------------------------ ------------
>>
>
Re: EMF databinding Recipe [message #420284 is a reply to message #420283] Tue, 24 June 2008 20:05 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33141
Registered: July 2009
Senior Member
AJ,

I'm not sure how you're getting there. Obviously it's expecting an
EObject, but it's getting the wrapper instead...


AJ wrote:
> Ed,
>
> Good point regarding the observeValue and the single-valued feature.
> That did help, thanks!
>
> Now, the hookListener is throwing a ClassCastException saying: Cannot
> cast org.eclipse.emf.databinding.EObjectObservableValue to
> org.eclipse.emf.ecore.EObject
>
> protected void hookListener(Object domainElement)
> {
> ((EObject)domainElement).eAdapters().add(elementListener);
> }
>
>
> So, I am not sure what I am missing at this point.
>
>
> Thanks again Ed!
>
>
>
> Ed Merks wrote:
>> AJ,
>>
>> Comments below.
>>
>> AJ wrote:
>>> Hello, Ed,
>>>
>>> Please see my comments/answers below. Thanks!
>>>
>>>
>>> Ed Merks wrote:
>>>> AJ,
>>>>
>>>> Comments below.
>>>>
>>>> AJ wrote:
>>>>> Hi,
>>>>>
>>>>> I have a view implementation that displays my EMF model via this
>>>>> mechanism:
>>>>>
>>>>> treeViewer.setContentProvider(new
>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>> new ADElementLabelDecorator()));
>>>>>
>>>>> However, now we would like to make use of the EMF databinding
>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>> something similar to the one suggested in the EMF Recipes, as
>>>>> shown below:
>>>>>
>>>>> ObservableListTreeContentProvider provider = new
>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>
>>>
>>> Hum? For some reason, I don't have/see the Literal.
>> Maybe your model is huge and it's not generated in that case because
>> you can only have so many constants in an interface. What you have
>> is fine, it's just that a constant is a better faster.
>>>
>>>> This feature isn't really a list though...
>>>>> treeViewer.setContentProvider(provider);
>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>> IObservableMap[] observeMaps =
>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>> });
>>>>> ObservableMapLabelProvider labelProvider = new
>>>>> ObservableMapLabelProvider(observeMaps);
>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>
>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>> (MSLADLType)model,
>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>
>>>>>
>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>> 'mSLADL' is not a valid feature at the
>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>>> is called.
>>>> Is it being called for a DocumentRoot instance?
>>>
>>> No, it was not. So, I have changed to this:
>>>
>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>
>>>
>>> However, it throws a ClassCastException at EObjectObservableList.
>>>
>>> java.lang.ClassCastException:
>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>> at
>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>
>>> at
>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>
>> Well, it's a single valued feature, so eGet won't return a list.
>> It sounds like you'd want observeValuoe.
>>>
>>>>>
>>>>> Although I have been using our best friend (the debugger) to trace
>>>>> the exception,
>>>> You've been reading the newsgroup a lot hey? :-P
>>>>> I would like to know first if anyone see any problems in the way I
>>>>> am setting up the treeviewer content and label providers for
>>>>> databinding. Unfortunately, the few examples available are using
>>>>> trableviewers instead of treeviewers.
>>>> What type of object is eOpenGet being called on. It will only work
>>>> for a document root instance...
>>>
>>> With the above change, eGet is now called instead of eOpenGet since
>>> the featureID value is 3.
>> That sounds like an improvement. You've just written it assuming a
>> list will come back when it's a single-valued feature (in the context
>> of a document root).
>>>
>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>> boolean coreType)
>>> {
>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>> if (featureID >= 0)
>>> {
>>> return eGet(featureID, resolve, coreType);
>>> }
>>> else
>>> {
>>> return eOpenGet(eFeature, resolve);
>>> }
>>> }
>>>
>>>>>
>>>>> Thanks in advance!
>>>>>
>>>
>>>
>>> ------------------------------------------------------------ ------------
>>>
>>>
>>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: EMF databinding Recipe [message #420353 is a reply to message #420283] Wed, 25 June 2008 20:31 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi AJ,

I've started to checkout how to use the new support and here is how it
works (The trick is that you need a mediator for EMF).

I'm just writing an example application showing EMF&Databinding with 3.4
at its best:

> Soccer soccer = SoccerFactory.eINSTANCE.createSoccer();
> Association fifa = SoccerFactory.eINSTANCE.createAssociation();
> fifa.setName("FIFA");
> Association uefa = SoccerFactory.eINSTANCE.createAssociation();
> uefa.setName("UEFA");
> fifa.getChildren().add(uefa);
> soccer.setAssociation(fifa);
>
> viewer.setContentProvider(new ObservableListTreeContentProvider(new ObservableFactoryImpl(),new TreeStructureAdvisorImpl()));
> viewer.setLabelProvider(new LabelProvider());
> viewer.setInput(new WritableList(Collections.singletonList(fifa),Association.cla ss));

The helper classes:

> private class ObservableFactoryImpl implements IObservableFactory {
>
> public IObservable createObservable(Object target) {
> if( target instanceof IObservableList ) {
> return (IObservable) target;
> } else {
> return EMFObservables.listFactory(Realm.getDefault(), SoccerPackage.Literals.ASSOCIATION__CHILDREN).createObservab le(target);
> }
> }
>
> }
>
> private class TreeStructureAdvisorImpl extends TreeStructureAdvisor {
>
> @Override
> public Object getParent(Object element) {
> if( element instanceof Association ) {
> return ((Association)element).getParent();
> }
> return null;
> }
>
> @Override
> public Boolean hasChildren(Object element) {
> if( element instanceof Association ) {
> return ((Association)element).getChildren().size() > 0;
> }
>
> return false;
> }
>
> }



AJ schrieb:
> Ed,
>
> Good point regarding the observeValue and the single-valued feature.
> That did help, thanks!
>
> Now, the hookListener is throwing a ClassCastException saying: Cannot
> cast org.eclipse.emf.databinding.EObjectObservableValue to
> org.eclipse.emf.ecore.EObject
>
> protected void hookListener(Object domainElement)
> {
> ((EObject)domainElement).eAdapters().add(elementListener);
> }
>
>
> So, I am not sure what I am missing at this point.
>
>
> Thanks again Ed!
>
>
>
> Ed Merks wrote:
>> AJ,
>>
>> Comments below.
>>
>> AJ wrote:
>>> Hello, Ed,
>>>
>>> Please see my comments/answers below. Thanks!
>>>
>>>
>>> Ed Merks wrote:
>>>> AJ,
>>>>
>>>> Comments below.
>>>>
>>>> AJ wrote:
>>>>> Hi,
>>>>>
>>>>> I have a view implementation that displays my EMF model via this
>>>>> mechanism:
>>>>>
>>>>> treeViewer.setContentProvider(new
>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>> new ADElementLabelDecorator()));
>>>>>
>>>>> However, now we would like to make use of the EMF databinding
>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>> something similar to the one suggested in the EMF Recipes, as shown
>>>>> below:
>>>>>
>>>>> ObservableListTreeContentProvider provider = new
>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>
>>>
>>> Hum? For some reason, I don't have/see the Literal.
>> Maybe your model is huge and it's not generated in that case because
>> you can only have so many constants in an interface. What you have is
>> fine, it's just that a constant is a better faster.
>>>
>>>> This feature isn't really a list though...
>>>>> treeViewer.setContentProvider(provider);
>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>> IObservableMap[] observeMaps =
>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>> });
>>>>> ObservableMapLabelProvider labelProvider = new
>>>>> ObservableMapLabelProvider(observeMaps);
>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>
>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>
>>>>>
>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>> 'mSLADL' is not a valid feature at the
>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>>> is called.
>>>> Is it being called for a DocumentRoot instance?
>>>
>>> No, it was not. So, I have changed to this:
>>>
>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>
>>>
>>> However, it throws a ClassCastException at EObjectObservableList.
>>>
>>> java.lang.ClassCastException:
>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>> at
>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>
>>> at
>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>
>> Well, it's a single valued feature, so eGet won't return a list. It
>> sounds like you'd want observeValuoe.
>>>
>>>>>
>>>>> Although I have been using our best friend (the debugger) to trace
>>>>> the exception,
>>>> You've been reading the newsgroup a lot hey? :-P
>>>>> I would like to know first if anyone see any problems in the way I
>>>>> am setting up the treeviewer content and label providers for
>>>>> databinding. Unfortunately, the few examples available are using
>>>>> trableviewers instead of treeviewers.
>>>> What type of object is eOpenGet being called on. It will only work
>>>> for a document root instance...
>>>
>>> With the above change, eGet is now called instead of eOpenGet since
>>> the featureID value is 3.
>> That sounds like an improvement. You've just written it assuming a
>> list will come back when it's a single-valued feature (in the context
>> of a document root).
>>>
>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>> boolean coreType)
>>> {
>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>> if (featureID >= 0)
>>> {
>>> return eGet(featureID, resolve, coreType);
>>> }
>>> else
>>> {
>>> return eOpenGet(eFeature, resolve);
>>> }
>>> }
>>>
>>>>>
>>>>> Thanks in advance!
>>>>>
>>>
>>>
>>> ------------------------------------------------------------ ------------
>>>
>>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: EMF databinding Recipe [message #420355 is a reply to message #420283] Wed, 25 June 2008 21:28 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi AJ,

I don't think you are missing anything here and currently to me it looks
like a mismatch between EMF-Databinding and Beans-Databinding.

I think Boris, Ed and Matt should get together some time and discuss
what's wrong here.

Tom

AJ schrieb:
> Ed,
>
> Good point regarding the observeValue and the single-valued feature.
> That did help, thanks!
>
> Now, the hookListener is throwing a ClassCastException saying: Cannot
> cast org.eclipse.emf.databinding.EObjectObservableValue to
> org.eclipse.emf.ecore.EObject
>
> protected void hookListener(Object domainElement)
> {
> ((EObject)domainElement).eAdapters().add(elementListener);
> }
>
>
> So, I am not sure what I am missing at this point.
>
>
> Thanks again Ed!
>
>
>
> Ed Merks wrote:
>> AJ,
>>
>> Comments below.
>>
>> AJ wrote:
>>> Hello, Ed,
>>>
>>> Please see my comments/answers below. Thanks!
>>>
>>>
>>> Ed Merks wrote:
>>>> AJ,
>>>>
>>>> Comments below.
>>>>
>>>> AJ wrote:
>>>>> Hi,
>>>>>
>>>>> I have a view implementation that displays my EMF model via this
>>>>> mechanism:
>>>>>
>>>>> treeViewer.setContentProvider(new
>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>> new ADElementLabelDecorator()));
>>>>>
>>>>> However, now we would like to make use of the EMF databinding
>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>> something similar to the one suggested in the EMF Recipes, as shown
>>>>> below:
>>>>>
>>>>> ObservableListTreeContentProvider provider = new
>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>
>>>
>>> Hum? For some reason, I don't have/see the Literal.
>> Maybe your model is huge and it's not generated in that case because
>> you can only have so many constants in an interface. What you have is
>> fine, it's just that a constant is a better faster.
>>>
>>>> This feature isn't really a list though...
>>>>> treeViewer.setContentProvider(provider);
>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>> IObservableMap[] observeMaps =
>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>> });
>>>>> ObservableMapLabelProvider labelProvider = new
>>>>> ObservableMapLabelProvider(observeMaps);
>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>
>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>> (MSLADLType)model, ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>
>>>>>
>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>> 'mSLADL' is not a valid feature at the
>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>>> is called.
>>>> Is it being called for a DocumentRoot instance?
>>>
>>> No, it was not. So, I have changed to this:
>>>
>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>
>>>
>>> However, it throws a ClassCastException at EObjectObservableList.
>>>
>>> java.lang.ClassCastException:
>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>> at
>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>
>>> at
>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>
>> Well, it's a single valued feature, so eGet won't return a list. It
>> sounds like you'd want observeValuoe.
>>>
>>>>>
>>>>> Although I have been using our best friend (the debugger) to trace
>>>>> the exception,
>>>> You've been reading the newsgroup a lot hey? :-P
>>>>> I would like to know first if anyone see any problems in the way I
>>>>> am setting up the treeviewer content and label providers for
>>>>> databinding. Unfortunately, the few examples available are using
>>>>> trableviewers instead of treeviewers.
>>>> What type of object is eOpenGet being called on. It will only work
>>>> for a document root instance...
>>>
>>> With the above change, eGet is now called instead of eOpenGet since
>>> the featureID value is 3.
>> That sounds like an improvement. You've just written it assuming a
>> list will come back when it's a single-valued feature (in the context
>> of a document root).
>>>
>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>> boolean coreType)
>>> {
>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>> if (featureID >= 0)
>>> {
>>> return eGet(featureID, resolve, coreType);
>>> }
>>> else
>>> {
>>> return eOpenGet(eFeature, resolve);
>>> }
>>> }
>>>
>>>>>
>>>>> Thanks in advance!
>>>>>
>>>
>>>
>>> ------------------------------------------------------------ ------------
>>>
>>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: EMF databinding Recipe [message #420358 is a reply to message #420355] Wed, 25 June 2008 21:56 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Just that it is not lost. The hookListener-method is never called in
case of BeansObservables.

I think we should file a bug.

Tom

Tom Schindl schrieb:
> Hi AJ,
>
> I don't think you are missing anything here and currently to me it looks
> like a mismatch between EMF-Databinding and Beans-Databinding.
>
> I think Boris, Ed and Matt should get together some time and discuss
> what's wrong here.
>
> Tom
>
> AJ schrieb:
>> Ed,
>>
>> Good point regarding the observeValue and the single-valued feature.
>> That did help, thanks!
>>
>> Now, the hookListener is throwing a ClassCastException saying: Cannot
>> cast org.eclipse.emf.databinding.EObjectObservableValue to
>> org.eclipse.emf.ecore.EObject
>>
>> protected void hookListener(Object domainElement)
>> {
>> ((EObject)domainElement).eAdapters().add(elementListener);
>> }
>>
>>
>> So, I am not sure what I am missing at this point.
>>
>>
>> Thanks again Ed!
>>
>>
>>
>> Ed Merks wrote:
>>> AJ,
>>>
>>> Comments below.
>>>
>>> AJ wrote:
>>>> Hello, Ed,
>>>>
>>>> Please see my comments/answers below. Thanks!
>>>>
>>>>
>>>> Ed Merks wrote:
>>>>> AJ,
>>>>>
>>>>> Comments below.
>>>>>
>>>>> AJ wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have a view implementation that displays my EMF model via this
>>>>>> mechanism:
>>>>>>
>>>>>> treeViewer.setContentProvider(new
>>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>>> new ADElementLabelDecorator()));
>>>>>>
>>>>>> However, now we would like to make use of the EMF databinding
>>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>>> something similar to the one suggested in the EMF Recipes, as
>>>>>> shown below:
>>>>>>
>>>>>> ObservableListTreeContentProvider provider = new
>>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>>
>>>>
>>>> Hum? For some reason, I don't have/see the Literal.
>>> Maybe your model is huge and it's not generated in that case because
>>> you can only have so many constants in an interface. What you have
>>> is fine, it's just that a constant is a better faster.
>>>>
>>>>> This feature isn't really a list though...
>>>>>> treeViewer.setContentProvider(provider);
>>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>>> IObservableMap[] observeMaps =
>>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>>> });
>>>>>> ObservableMapLabelProvider labelProvider = new
>>>>>> ObservableMapLabelProvider(observeMaps);
>>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>>
>>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>>> (MSLADLType)model,
>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>>
>>>>>>
>>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>>> 'mSLADL' is not a valid feature at the
>>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>>>> is called.
>>>>> Is it being called for a DocumentRoot instance?
>>>>
>>>> No, it was not. So, I have changed to this:
>>>>
>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>>
>>>>
>>>> However, it throws a ClassCastException at EObjectObservableList.
>>>>
>>>> java.lang.ClassCastException:
>>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>>> at
>>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>>
>>>> at
>>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>>
>>> Well, it's a single valued feature, so eGet won't return a list.
>>> It sounds like you'd want observeValuoe.
>>>>
>>>>>>
>>>>>> Although I have been using our best friend (the debugger) to trace
>>>>>> the exception,
>>>>> You've been reading the newsgroup a lot hey? :-P
>>>>>> I would like to know first if anyone see any problems in the way I
>>>>>> am setting up the treeviewer content and label providers for
>>>>>> databinding. Unfortunately, the few examples available are using
>>>>>> trableviewers instead of treeviewers.
>>>>> What type of object is eOpenGet being called on. It will only work
>>>>> for a document root instance...
>>>>
>>>> With the above change, eGet is now called instead of eOpenGet since
>>>> the featureID value is 3.
>>> That sounds like an improvement. You've just written it assuming a
>>> list will come back when it's a single-valued feature (in the context
>>> of a document root).
>>>>
>>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>>> boolean coreType)
>>>> {
>>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>>> if (featureID >= 0)
>>>> {
>>>> return eGet(featureID, resolve, coreType);
>>>> }
>>>> else
>>>> {
>>>> return eOpenGet(eFeature, resolve);
>>>> }
>>>> }
>>>>
>>>>>>
>>>>>> Thanks in advance!
>>>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------ ------------
>>>>
>>>>
>>>
>
>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: EMF databinding Recipe [message #420370 is a reply to message #420355] Thu, 26 June 2008 15:50 Go to previous messageGo to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
Hi Tom,

So, does it mean that there are still problems when one tries to utilize
the platform databinding API in conjunction with the EMF databinding
interface?

Thanks,
-AJ


Tom Schindl wrote:
> Hi AJ,
>
> I don't think you are missing anything here and currently to me it looks
> like a mismatch between EMF-Databinding and Beans-Databinding.
>
> I think Boris, Ed and Matt should get together some time and discuss
> what's wrong here.
>
> Tom
>
> AJ schrieb:
>> Ed,
>>
>> Good point regarding the observeValue and the single-valued feature.
>> That did help, thanks!
>>
>> Now, the hookListener is throwing a ClassCastException saying: Cannot
>> cast org.eclipse.emf.databinding.EObjectObservableValue to
>> org.eclipse.emf.ecore.EObject
>>
>> protected void hookListener(Object domainElement)
>> {
>> ((EObject)domainElement).eAdapters().add(elementListener);
>> }
>>
>>
>> So, I am not sure what I am missing at this point.
>>
>>
>> Thanks again Ed!
>>
>>
>>
>> Ed Merks wrote:
>>> AJ,
>>>
>>> Comments below.
>>>
>>> AJ wrote:
>>>> Hello, Ed,
>>>>
>>>> Please see my comments/answers below. Thanks!
>>>>
>>>>
>>>> Ed Merks wrote:
>>>>> AJ,
>>>>>
>>>>> Comments below.
>>>>>
>>>>> AJ wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have a view implementation that displays my EMF model via this
>>>>>> mechanism:
>>>>>>
>>>>>> treeViewer.setContentProvider(new
>>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>>> new ADElementLabelDecorator()));
>>>>>>
>>>>>> However, now we would like to make use of the EMF databinding
>>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>>> something similar to the one suggested in the EMF Recipes, as
>>>>>> shown below:
>>>>>>
>>>>>> ObservableListTreeContentProvider provider = new
>>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>>
>>>>
>>>> Hum? For some reason, I don't have/see the Literal.
>>> Maybe your model is huge and it's not generated in that case because
>>> you can only have so many constants in an interface. What you have
>>> is fine, it's just that a constant is a better faster.
>>>>
>>>>> This feature isn't really a list though...
>>>>>> treeViewer.setContentProvider(provider);
>>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>>> IObservableMap[] observeMaps =
>>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>>> });
>>>>>> ObservableMapLabelProvider labelProvider = new
>>>>>> ObservableMapLabelProvider(observeMaps);
>>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>>
>>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>>> (MSLADLType)model,
>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>>
>>>>>>
>>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>>> 'mSLADL' is not a valid feature at the
>>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when setInput
>>>>>> is called.
>>>>> Is it being called for a DocumentRoot instance?
>>>>
>>>> No, it was not. So, I have changed to this:
>>>>
>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>>
>>>>
>>>> However, it throws a ClassCastException at EObjectObservableList.
>>>>
>>>> java.lang.ClassCastException:
>>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>>> at
>>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>>
>>>> at
>>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>>
>>> Well, it's a single valued feature, so eGet won't return a list.
>>> It sounds like you'd want observeValuoe.
>>>>
>>>>>>
>>>>>> Although I have been using our best friend (the debugger) to trace
>>>>>> the exception,
>>>>> You've been reading the newsgroup a lot hey? :-P
>>>>>> I would like to know first if anyone see any problems in the way I
>>>>>> am setting up the treeviewer content and label providers for
>>>>>> databinding. Unfortunately, the few examples available are using
>>>>>> trableviewers instead of treeviewers.
>>>>> What type of object is eOpenGet being called on. It will only work
>>>>> for a document root instance...
>>>>
>>>> With the above change, eGet is now called instead of eOpenGet since
>>>> the featureID value is 3.
>>> That sounds like an improvement. You've just written it assuming a
>>> list will come back when it's a single-valued feature (in the context
>>> of a document root).
>>>>
>>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>>> boolean coreType)
>>>> {
>>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>>> if (featureID >= 0)
>>>> {
>>>> return eGet(featureID, resolve, coreType);
>>>> }
>>>> else
>>>> {
>>>> return eOpenGet(eFeature, resolve);
>>>> }
>>>> }
>>>>
>>>>>>
>>>>>> Thanks in advance!
>>>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------ ------------
>>>>
>>>>
>>>
>
>
Re: EMF databinding Recipe [message #420371 is a reply to message #420370] Thu, 26 June 2008 16:04 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi AJ,

I didn't get to the bottom of the problem yesterday and today in the
evening I don't have time because I need to watch soccer :-)

I have a small test EMF model for an example application I writing which
I will attach to a bug report when ready.

As far as I can see now the problem is in the content provider which is
build the knowElements but I haven't yet understood how this is supposed
to work I simply stepped through it with the debugger and found out that
in case of Beans-Example it is not trying to attach a listener to the
IObservableSet but I have no idea why :-(

Tom

AJ schrieb:
> Hi Tom,
>
> So, does it mean that there are still problems when one tries to utilize
> the platform databinding API in conjunction with the EMF databinding
> interface?
>
> Thanks,
> -AJ
>
>
> Tom Schindl wrote:
>> Hi AJ,
>>
>> I don't think you are missing anything here and currently to me it
>> looks like a mismatch between EMF-Databinding and Beans-Databinding.
>>
>> I think Boris, Ed and Matt should get together some time and discuss
>> what's wrong here.
>>
>> Tom
>>
>> AJ schrieb:
>>> Ed,
>>>
>>> Good point regarding the observeValue and the single-valued feature.
>>> That did help, thanks!
>>>
>>> Now, the hookListener is throwing a ClassCastException saying: Cannot
>>> cast org.eclipse.emf.databinding.EObjectObservableValue to
>>> org.eclipse.emf.ecore.EObject
>>>
>>> protected void hookListener(Object domainElement)
>>> {
>>> ((EObject)domainElement).eAdapters().add(elementListener);
>>> }
>>>
>>>
>>> So, I am not sure what I am missing at this point.
>>>
>>>
>>> Thanks again Ed!
>>>
>>>
>>>
>>> Ed Merks wrote:
>>>> AJ,
>>>>
>>>> Comments below.
>>>>
>>>> AJ wrote:
>>>>> Hello, Ed,
>>>>>
>>>>> Please see my comments/answers below. Thanks!
>>>>>
>>>>>
>>>>> Ed Merks wrote:
>>>>>> AJ,
>>>>>>
>>>>>> Comments below.
>>>>>>
>>>>>> AJ wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I have a view implementation that displays my EMF model via this
>>>>>>> mechanism:
>>>>>>>
>>>>>>> treeViewer.setContentProvider(new
>>>>>>> AdapterFactoryContentProvider(adapterFactory));
>>>>>>> treeViewer.setLabelProvider(new DecoratingLabelProvider(new
>>>>>>> AdapterFactoryLabelProvider(adapterFactory),
>>>>>>> new ADElementLabelDecorator()));
>>>>>>>
>>>>>>> However, now we would like to make use of the EMF databinding
>>>>>>> capability in 2.4 so I have tried to replace the above code with
>>>>>>> something similar to the one suggested in the EMF Recipes, as
>>>>>>> shown below:
>>>>>>>
>>>>>>> ObservableListTreeContentProvider provider = new
>>>>>>> ObservableListTreeContentProvider(EMFObservables.listFactory (Realm.getDefault(),
>>>>>>> ADPackage.eINSTANCE.getDocumentRoot_MSLADL()), null);
>>>>>> Probably ADPackage.Literals.DOCUMENT_ROOT__MSLADL is more efficient.
>>>>>
>>>>>
>>>>> Hum? For some reason, I don't have/see the Literal.
>>>> Maybe your model is huge and it's not generated in that case because
>>>> you can only have so many constants in an interface. What you have
>>>> is fine, it's just that a constant is a better faster.
>>>>>
>>>>>> This feature isn't really a list though...
>>>>>>> treeViewer.setContentProvider(provider);
>>>>>>> IObservableSet knownElements = provider.getKnownElements();
>>>>>>> IObservableMap[] observeMaps =
>>>>>>> EMFObservables.observeMaps(knownElements, new EStructuralFeature[] {
>>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs(),
>>>>>>> ADPackage.eINSTANCE.getMSLADLType_AuthorInformation()
>>>>>>> });
>>>>>>> ObservableMapLabelProvider labelProvider = new
>>>>>>> ObservableMapLabelProvider(observeMaps);
>>>>>>> treeViewer.setLabelProvider(labelProvider);
>>>>>>>
>>>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>>>> (MSLADLType)model,
>>>>>>> ADPackage.eINSTANCE.getMSLADLType_ActivityDefs()));
>>>>>>>
>>>>>>>
>>>>>>> But, I am getting this IllegalArgumentException: The feature
>>>>>>> 'mSLADL' is not a valid feature at the
>>>>>>> BasicEObjectImpl.eOpenGet(BasicEObjectImpl.java:1062 when
>>>>>>> setInput is called.
>>>>>> Is it being called for a DocumentRoot instance?
>>>>>
>>>>> No, it was not. So, I have changed to this:
>>>>>
>>>>> getViewer().setInput(EMFObservables.observeList(Realm.getDef ault(),
>>>>> ((MSLADLType)model).eContainer(),ADPackage.eINSTANCE.getDocu mentRoot_MSLADL()));
>>>>>
>>>>>
>>>>> However, it throws a ClassCastException at EObjectObservableList.
>>>>>
>>>>> java.lang.ClassCastException:
>>>>> gov.nasa.ensemble.jfa.activityDictionary.model.impl.MSLADLTy peImpl
>>>>> at
>>>>> org.eclipse.emf.databinding.EObjectObservableList.<init>(EObjectObservableList.java:52)
>>>>>
>>>>> at
>>>>> org.eclipse.emf.databinding.EMFObservables.observeList(EMFOb servables.java:81)
>>>>>
>>>> Well, it's a single valued feature, so eGet won't return a list.
>>>> It sounds like you'd want observeValuoe.
>>>>>
>>>>>>>
>>>>>>> Although I have been using our best friend (the debugger) to
>>>>>>> trace the exception,
>>>>>> You've been reading the newsgroup a lot hey? :-P
>>>>>>> I would like to know first if anyone see any problems in the way
>>>>>>> I am setting up the treeviewer content and label providers for
>>>>>>> databinding. Unfortunately, the few examples available are using
>>>>>>> trableviewers instead of treeviewers.
>>>>>> What type of object is eOpenGet being called on. It will only
>>>>>> work for a document root instance...
>>>>>
>>>>> With the above change, eGet is now called instead of eOpenGet since
>>>>> the featureID value is 3.
>>>> That sounds like an improvement. You've just written it assuming a
>>>> list will come back when it's a single-valued feature (in the
>>>> context of a document root).
>>>>>
>>>>> public Object eGet(EStructuralFeature eFeature, boolean resolve,
>>>>> boolean coreType)
>>>>> {
>>>>> int featureID = eDerivedStructuralFeatureID(eFeature);
>>>>> if (featureID >= 0)
>>>>> {
>>>>> return eGet(featureID, resolve, coreType);
>>>>> }
>>>>> else
>>>>> {
>>>>> return eOpenGet(eFeature, resolve);
>>>>> }
>>>>> }
>>>>>
>>>>>>>
>>>>>>> Thanks in advance!
>>>>>>>
>>>>>
>>>>>
>>>>> ------------------------------------------------------------ ------------
>>>>>
>>>>>
>>>>
>>
>>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: EMF databinding Recipe [message #420372 is a reply to message #420371] Thu, 26 June 2008 16:21 Go to previous messageGo to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
Ops! I totally forgot that Spain plays against Russia today. Thanks for
reminding me. I am heading home right now. You see, your reply was still
helpful ;-)

I look forward to the example application.

Thanks again Tom!

Ciao,
-AJ
Re: EMF databinding Recipe [message #420391 is a reply to message #420353] Fri, 27 June 2008 19:09 Go to previous messageGo to next message
Al B is currently offline Al BFriend
Messages: 130
Registered: July 2009
Senior Member
Hey Tom,

I have been experimenting with your mediator approach and I have
encountered a couple of problems.

If I use a WritableList to set the viewer's input, it causes a
ClassCastException in the EObjectObservableMap::hookListener because it is
expecting an EObject instead.

Also, in my case, I need to display the container for the ActivityDef
elements; which is a single valued feature. So, I need to call
EMFObservables.valueFactory instead of EMFObservables.listFactory, as
shown below. However,
ObservableCollectionTreeContentProvider::initChildren is always assuming
that createObservable will return an IObservableCollection causing it to
throw a ClassCastException as well.

return EMFObservables.valueFactory(Realm.getDefault(),
MSLADLPackage.Literals.MSLADL_TYPE__ACTIVITY_DEFS)
.createObservable((target instanceof CategoriesItemProvider) ?
((CategoriesItemProvider) target).getParent(target) : target);

MSLADLType
|
|->ActivityDefs
|
|-->ActivityDef1
|
|-->ActivityDef2
|
|-->ActivityDefN


I might be missing something, but it seems to me that there are still some
integration problems between EMF and the Platform/JFace databinding.
Re: EMF databinding Recipe [message #420400 is a reply to message #420391] Fri, 27 June 2008 22:44 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi AJ,

My first attempt was totally wrong and IMHO the current TreeViewer
support is not as good as I thought it is.

The main problem is how ObservableMap works. It assumes that every
element has the attribute(s) you are trying to observe (*even* the input
has to have the attribute although it is not shown which doesn't make
sense IMHO).

Here's my code:

> private class ObservableFactoryImpl implements IObservableFactory {
>
> public IObservable createObservable(Object target) {
> if( target instanceof Soccer ) {
> return new WritableList(Collections.singletonList(((Soccer)target).getA ssociation()),Soccer.class);
> } else {
> return EMFObservables.listFactory(Realm.getDefault(), SoccerPackage.Literals.ASSOCIATION__CHILDREN).createObservab le(target);
> }
> }
>
> }
>
> private class TreeStructureAdvisorImpl extends TreeStructureAdvisor {
>
> @Override
> public Object getParent(Object element) {
> if( element instanceof Association ) {
> return ((Association)element).getParent();
> }
> return null;
> }
>
> @Override
> public Boolean hasChildren(Object element) {
> if( element instanceof Association ) {
> return ((Association)element).getChildren().size() > 0;
> }
>
> return false;
> }
>
> }

> private IObservableValue createTreeViewer(Composite parent) {
> TreeViewer viewer = new TreeViewer(parent);
>
> Soccer soccer = SoccerFactory.eINSTANCE.createSoccer();
> Association fifa = SoccerFactory.eINSTANCE.createAssociation();
> fifa.setName("FIFA");
> Association uefa = SoccerFactory.eINSTANCE.createAssociation();
> uefa.setName("UEFA");
> fifa.getChildren().add(uefa);
> soccer.setAssociation(fifa);
>
>
> ObservableListTreeContentProvider cp = new ObservableListTreeContentProvider(new ObservableFactoryImpl(),new TreeStructureAdvisorImpl());
> viewer.setContentProvider(cp);
>
> IObservableMap map = EMFObservables.observeMap(cp.getKnownElements(), SoccerPackage.Literals.NAME_PROVIDER__NAME);
> viewer.setLabelProvider(new ObservableColumnLabelProvider(map,"{0}"));
>
> viewer.setInput(soccer);
>
> return ViewersObservables.observeSingleSelection(viewer);
> }

What has to change in ObservableListTreeContentProvider:
- input should not get part of knowElements (also crutial for to use it
in detail of master-detail where one often passes an IObservableList)

- the ObservableMap creation must also get delegated else one could
not have different object types e.g. a tree like:

A (name)
+ B (name)
+ C (name)

The bean people don't have a problem with this because they are using
Strings in EMF this is not the case because A:name is a different
feature than B:name and C:name but would also fail with something like this:

A (name)
+ B (label)
+ C (text)


I'll trying to summerize this and discuss it with Matt.

By the way the code I use is available from my SVN-Repo:
http://publicsvn.bestsolution.at/repos/java/examples/EMF-Dat abinding/

Tom

--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: EMF databinding Recipe [message #420442 is a reply to message #420400] Mon, 30 June 2008 16:46 Go to previous message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
You are right, the input should not be in the known elements. I think
this can be safely fixed for 3.4.1. Could you file a bug?

An unrelated question: are you sure about returning false in
TreeStructureAdvisorImpl.hasChildren()? This method should return null
if it cannot provide a definitive yes or no answer.

Matthew

Tom Schindl wrote:
> Hi AJ,
>
> My first attempt was totally wrong and IMHO the current TreeViewer
> support is not as good as I thought it is.
>
> The main problem is how ObservableMap works. It assumes that every
> element has the attribute(s) you are trying to observe (*even* the input
> has to have the attribute although it is not shown which doesn't make
> sense IMHO).
>
> Here's my code:
>
>> private class ObservableFactoryImpl implements IObservableFactory {
>>
>> public IObservable createObservable(Object target) {
>> if( target instanceof Soccer ) {
>> return new
>> WritableList(Collections.singletonList(((Soccer)target).getA ssociation()),Soccer.class);
>>
>> } else {
>> return EMFObservables.listFactory(Realm.getDefault(),
>> SoccerPackage.Literals.ASSOCIATION__CHILDREN).createObservab le(target);
>>
>> }
>> }
>>
>> }
>>
>> private class TreeStructureAdvisorImpl extends TreeStructureAdvisor {
>>
>> @Override
>> public Object getParent(Object element) {
>> if( element instanceof Association ) {
>> return ((Association)element).getParent();
>> }
>> return null;
>> }
>>
>> @Override
>> public Boolean hasChildren(Object element) {
>> if( element instanceof Association ) {
>> return ((Association)element).getChildren().size() > 0;
>> }
>>
>> return false;
>> }
>>
>> }
>
>> private IObservableValue createTreeViewer(Composite parent) {
>> TreeViewer viewer = new TreeViewer(parent);
>>
>> Soccer soccer = SoccerFactory.eINSTANCE.createSoccer();
>> Association fifa = SoccerFactory.eINSTANCE.createAssociation();
>> fifa.setName("FIFA");
>> Association uefa = SoccerFactory.eINSTANCE.createAssociation();
>> uefa.setName("UEFA");
>> fifa.getChildren().add(uefa);
>> soccer.setAssociation(fifa);
>>
>>
>> ObservableListTreeContentProvider cp = new
>> ObservableListTreeContentProvider(new ObservableFactoryImpl(),new
>> TreeStructureAdvisorImpl());
>> viewer.setContentProvider(cp);
>>
>> IObservableMap map =
>> EMFObservables.observeMap(cp.getKnownElements(),
>> SoccerPackage.Literals.NAME_PROVIDER__NAME);
>> viewer.setLabelProvider(new
>> ObservableColumnLabelProvider(map,"{0}"));
>>
>> viewer.setInput(soccer);
>>
>> return ViewersObservables.observeSingleSelection(viewer);
>> }
>
> What has to change in ObservableListTreeContentProvider:
> - input should not get part of knowElements (also crutial for to use it
> in detail of master-detail where one often passes an IObservableList)
>
> - the ObservableMap creation must also get delegated else one could
> not have different object types e.g. a tree like:
>
> A (name)
> + B (name)
> + C (name)
>
> The bean people don't have a problem with this because they are using
> Strings in EMF this is not the case because A:name is a different
> feature than B:name and C:name but would also fail with something like
> this:
>
> A (name)
> + B (label)
> + C (text)
>
>
> I'll trying to summerize this and discuss it with Matt.
>
> By the way the code I use is available from my SVN-Repo:
> http://publicsvn.bestsolution.at/repos/java/examples/EMF-Dat abinding/
>
> Tom
>
Re: EMF databinding Recipe [message #420443 is a reply to message #420442] Mon, 30 June 2008 16:03 Go to previous message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Filed as https://bugs.eclipse.org/bugs/show_bug.cgi?id=239015

Tom

Matthew Hall schrieb:
> You are right, the input should not be in the known elements. I think
> this can be safely fixed for 3.4.1. Could you file a bug?
>
> An unrelated question: are you sure about returning false in
> TreeStructureAdvisorImpl.hasChildren()? This method should return null
> if it cannot provide a definitive yes or no answer.
>
> Matthew
>
> Tom Schindl wrote:
>> Hi AJ,
>>
>> My first attempt was totally wrong and IMHO the current TreeViewer
>> support is not as good as I thought it is.
>>
>> The main problem is how ObservableMap works. It assumes that every
>> element has the attribute(s) you are trying to observe (*even* the
>> input has to have the attribute although it is not shown which doesn't
>> make sense IMHO).
>>
>> Here's my code:
>>
>>> private class ObservableFactoryImpl implements IObservableFactory {
>>>
>>> public IObservable createObservable(Object target) {
>>> if( target instanceof Soccer ) {
>>> return new
>>> WritableList(Collections.singletonList(((Soccer)target).getA ssociation()),Soccer.class);
>>>
>>> } else {
>>> return EMFObservables.listFactory(Realm.getDefault(),
>>> SoccerPackage.Literals.ASSOCIATION__CHILDREN).createObservab le(target);
>>>
>>> }
>>> }
>>> }
>>> private class TreeStructureAdvisorImpl extends
>>> TreeStructureAdvisor {
>>>
>>> @Override
>>> public Object getParent(Object element) {
>>> if( element instanceof Association ) {
>>> return ((Association)element).getParent();
>>> }
>>> return null;
>>> }
>>>
>>> @Override
>>> public Boolean hasChildren(Object element) {
>>> if( element instanceof Association ) {
>>> return ((Association)element).getChildren().size() > 0;
>>> }
>>> return false;
>>> }
>>> }
>>
>>> private IObservableValue createTreeViewer(Composite parent) {
>>> TreeViewer viewer = new TreeViewer(parent);
>>> Soccer soccer = SoccerFactory.eINSTANCE.createSoccer();
>>> Association fifa = SoccerFactory.eINSTANCE.createAssociation();
>>> fifa.setName("FIFA");
>>> Association uefa = SoccerFactory.eINSTANCE.createAssociation();
>>> uefa.setName("UEFA");
>>> fifa.getChildren().add(uefa);
>>> soccer.setAssociation(fifa);
>>> ObservableListTreeContentProvider cp = new
>>> ObservableListTreeContentProvider(new ObservableFactoryImpl(),new
>>> TreeStructureAdvisorImpl());
>>> viewer.setContentProvider(cp);
>>> IObservableMap map =
>>> EMFObservables.observeMap(cp.getKnownElements(),
>>> SoccerPackage.Literals.NAME_PROVIDER__NAME);
>>> viewer.setLabelProvider(new
>>> ObservableColumnLabelProvider(map,"{0}"));
>>> viewer.setInput(soccer);
>>> return ViewersObservables.observeSingleSelection(viewer);
>>> }
>>
>> What has to change in ObservableListTreeContentProvider:
>> - input should not get part of knowElements (also crutial for to use it
>> in detail of master-detail where one often passes an IObservableList)
>>
>> - the ObservableMap creation must also get delegated else one could
>> not have different object types e.g. a tree like:
>>
>> A (name)
>> + B (name)
>> + C (name)
>>
>> The bean people don't have a problem with this because they are using
>> Strings in EMF this is not the case because A:name is a different
>> feature than B:name and C:name but would also fail with something like
>> this:
>>
>> A (name)
>> + B (label)
>> + C (text)
>>
>>
>> I'll trying to summerize this and discuss it with Matt.
>>
>> By the way the code I use is available from my SVN-Repo:
>> http://publicsvn.bestsolution.at/repos/java/examples/EMF-Dat abinding/
>>
>> Tom
>>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Previous Topic:Loading certain parts of an XML as text, not EObjects
Next Topic:Does EMFObservables provide undo/redo functionality?
Goto Forum:
  


Current Time: Thu Apr 25 21:24:32 GMT 2024

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

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

Back to the top