Home » Eclipse Projects » Eclipse Platform » Databinding for Combo behaves differently in 3.4 
| Databinding for Combo behaves differently in 3.4 [message #332436] | 
Tue, 21 October 2008 13:54   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Originally posted by: alexm.xxx.yyy 
 
This is a multi-part message in MIME format. 
--------------020902080207080905020201 
Content-Type: text/plain; charset=ISO-8859-1; format=flowed 
Content-Transfer-Encoding: 7bit 
 
The change in behavior between Eclipse 3.3 and 3.4 is significant and  
breaks the existing logic. 
 
Here is what happens: a data model carries an array of String items  
(colourScales) that populate the Combo's drop-down list, and a single  
String (colorScale) to track its selection. 
 
 
When the data model is bound to a Combo box, as below 
 
Combo colorScale = ... 
DataBindingContext dbc = ... 
dbc.bindList(SWTObservables.observeItems(colorScale),  
BeansObservables.observeList(Realm.getDefault(), dataModel,  
"colourScales"), null, null); 
 
the Combo fires a text-change event, setting the model's colorScale  
property to a blank value, and corrupting it as the result. 
 
In Eclipse 3.3, binding a Combo to an array of String items did not  
trigger any change in the Combo's current selection (and it shouldn't have). 
 
I slightly modified one of the databinding Snippets to demonstrate this  
effect. Run the attached code under 3.3, and then under 3.4 to see the  
difference. 
 
My questions are: 
 
1. is this a planned change in behavior? 
2. if so, how can I prevent the undesirable side effect of changing the  
data model's property when binding items to the Combo? 
 
Thanks for any clues. 
 
Alex Molochnikov 
Kelman Technologies Inc. 
 
--------------020902080207080905020201 
Content-Type: text/plain; 
 name="Snippet002UpdateComboRetainSelection.java" 
Content-Transfer-Encoding: base64 
Content-Disposition: inline; 
 filename="Snippet002UpdateComboRetainSelection.java" 
 
 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioq 
 KioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykg MjAwNiBUaGUg 
 UGFtcGVyZWQgQ2hlZiwgSW5jLiBhbmQgb3RoZXJzLg0KICogQWxsIHJpZ2h0 cyByZXNlcnZl 
 ZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFs cw0KICogYXJl 
 IG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBz ZSBQdWJsaWMg 
 TGljZW5zZSB2MS4wDQogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3Ry aWJ1dGlvbiwg 
 YW5kIGlzIGF2YWlsYWJsZSBhdA0KICogaHR0cDovL3d3dy5lY2xpcHNlLm9y Zy9sZWdhbC9l 
 cGwtdjEwLmh0bWwNCiAqDQogKiBDb250cmlidXRvcnM6DQogKiAgICAgVGhl IFBhbXBlcmVk 
 IENoZWYsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24N CiAqICAgICBC 
 cmFkIFJleW5vbGRzIC0gYnVnIDExNjkyMA0KICoqKioqKioqKioqKioqKioq KioqKioqKioq 
 KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8N 
 Cg0KcGFja2FnZSBvcmcuZWNsaXBzZS5qZmFjZS5leGFtcGxlcy5kYXRhYmlu ZGluZy5zbmlw 
 cGV0czsNCg0KaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0 ZW5lcjsNCmlt 
 cG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsNCmltcG9y dCBqYXZhLnV0 
 aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KDQppbXBv cnQgb3JnLmVj 
 bGlwc2UuY29yZS5kYXRhYmluZGluZy5EYXRhQmluZGluZ0NvbnRleHQ7DQpp bXBvcnQgb3Jn 
 LmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5iZWFucy5CZWFuc09ic2VydmFi bGVzOw0KaW1w 
 b3J0IG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcub2JzZXJ2YWJsZS5S ZWFsbTsNCmlt 
 cG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZy5zd3QuU1dUT2Jz ZXJ2YWJsZXM7 
 DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCmltcG9ydCBvcmcuZWNs aXBzZS5zd3Qu 
 ZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2Uu c3d0LmV2ZW50 
 cy5TZWxlY3Rpb25FdmVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5 b3V0LlJvd0xh 
 eW91dDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247 DQppbXBvcnQg 
 b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87DQppbXBvcnQgb3JnLmVj bGlwc2Uuc3d0 
 LndpZGdldHMuRGlzcGxheTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lk Z2V0cy5TaGVs 
 bDsNCg0KLyoqDQogKiBTaG93cyBob3cgdG8gYmluZCBhIENvbWJvIHNvIHRo YXQgd2hlbiB1 
 cGRhdGUgaXRzIGl0ZW1zLCB0aGUgc2VsZWN0aW9uIGlzDQogKiByZXRhaW5l ZCBpZiBhdCBh 
 bGwgcG9zc2libGUuDQogKiANCiAqIEBzaW5jZSAzLjINCiAqLw0KcHVibGlj IGNsYXNzIFNu 
 aXBwZXQwMDJVcGRhdGVDb21ib1JldGFpblNlbGVjdGlvbiB7DQogICAgcHVi bGljIHN0YXRp 
 YyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KICAgIAlmaW5hbCBEaXNw bGF5IGRpc3Bs 
 YXkgPSBuZXcgRGlzcGxheSgpOw0KICAgIAlSZWFsbS5ydW5XaXRoRGVmYXVs dChTV1RPYnNl 
 cnZhYmxlcy5nZXRSZWFsbShkaXNwbGF5KSwgbmV3IFJ1bm5hYmxlKCkgew0K ICAgIAkJcHVi 
 bGljIHZvaWQgcnVuKCkgew0KICAgIAkJCVZpZXdNb2RlbCB2aWV3TW9kZWwg PSBuZXcgVmll 
 d01vZGVsKCk7DQogICAgCQkJU2hlbGwgc2hlbGwgPSBuZXcgVmlldyh2aWV3 TW9kZWwpLmNy 
 ZWF0ZVNoZWxsKCk7DQogICAgCQkJDQogICAgCQkJLy8gVGhlIFNXVCBldmVu dCBsb29wDQog 
 ICAgCQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsNCiAgICAJCQkJ aWYgKCFkaXNw 
 bGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7DQogICAgCQkJCQlkaXNwbGF5LnNs ZWVwKCk7DQog 
 ICAgCQkJCX0NCiAgICAJCQl9DQogICAgCQkJDQogICAgCQkJLy8gUHJpbnQg dGhlIHJlc3Vs 
 dHMNCiAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4odmlld01vZGVsLmdldFRl eHQoKSk7DQog 
 ICAgCQl9DQogICAgCX0pOw0KICAgIAlkaXNwbGF5LmRpc3Bvc2UoKTsNCiAg ICB9DQoNCiAg 
 ICAvLyBNaW5pbWFsIEphdmFCZWFucyBzdXBwb3J0DQogICAgcHVibGljIHN0 YXRpYyBhYnN0 
 cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsT2JqZWN0IHsNCiAgICAgICAgcHJp dmF0ZSBQcm9w 
 ZXJ0eUNoYW5nZVN1cHBvcnQgcHJvcGVydHlDaGFuZ2VTdXBwb3J0ID0gbmV3 IFByb3BlcnR5 
 Q2hhbmdlU3VwcG9ydCh0aGlzKTsNCg0KICAgICAgICBwdWJsaWMgdm9pZCBh ZGRQcm9wZXJ0 
 eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVu ZXIpIHsNCiAg 
 ICAgICAgICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydC5hZGRQcm9wZXJ0eUNo YW5nZUxpc3Rl 
 bmVyKGxpc3RlbmVyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2 b2lkIGFkZFBy 
 b3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJv cGVydHlDaGFu 
 Z2VMaXN0ZW5lciBsaXN0ZW5lcikgew0KICAgICAgICAgICAgcHJvcGVydHlD aGFuZ2VTdXBw 
 b3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBs aXN0ZW5lcik7 
 DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9w ZXJ0eUNoYW5n 
 ZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsN CiAgICAgICAg 
 ICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydC5yZW1vdmVQcm9wZXJ0eUNoYW5n ZUxpc3RlbmVy 
 KGxpc3RlbmVyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lk IHJlbW92ZVBy 
 b3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJv cGVydHlDaGFu 
 Z2VMaXN0ZW5lciBsaXN0ZW5lcikgew0KICAgICAgICAgICAgcHJvcGVydHlD aGFuZ2VTdXBw 
 b3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1l LCBsaXN0ZW5l 
 cik7DQogICAgICAgIH0NCg0KICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaXJl UHJvcGVydHlD 
 aGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBP YmplY3QgbmV3 
 VmFsdWUpIHsNCiAgICAgICAgICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydC5m aXJlUHJvcGVy 
 dHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOw0K ICAgICAgICB9 
 DQogICAgfQ0KDQogICAgLy8gVGhlIFZpZXcncyBtb2RlbC0tdGhlIHJvb3Qg b2Ygb3VyIE1v 
 ZGVsIGdyYXBoIGZvciB0aGlzIHBhcnRpY3VsYXIgR1VJLg0KICAgIHB1Ymxp YyBzdGF0aWMg 
 Y2xhc3MgVmlld01vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbE9iamVjdCB7 DQogICAgICAg 
 IHByaXZhdGUgU3RyaW5nIHRleHQgPSAiYmVlZiI7DQoNCiAgICAgICAgcHJp dmF0ZSBMaXN0 
 IGNob2ljZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQogICAgICAgIHsNCiAgICAg ICAgICAgIGNo 
 b2ljZXMuYWRkKCJwb3JrIik7DQogICAgICAgICAgICBjaG9pY2VzLmFkZCgi YmVlZiIpOw0K 
 ICAgICAgICAgICAgY2hvaWNlcy5hZGQoInBvdWx0cnkiKTsNCiAgICAgICAg ICAgIGNob2lj 
 ZXMuYWRkKCJ2ZWdhdGFibGVzIik7DQogICAgICAgIH0NCg0KICAgICAgICBw dWJsaWMgTGlz 
 dCBnZXRDaG9pY2VzKCkgew0KICAgICAgICAgICAgcmV0dXJuIGNob2ljZXM7 DQogICAgICAg 
 IH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VzKExpc3QgY2hv aWNlcykgew0K 
 ICAgICAgICAgICAgTGlzdCBvbGQgPSB0aGlzLmNob2ljZXM7DQogICAgICAg ICAgICB0aGlz 
 LmNob2ljZXMgPSBjaG9pY2VzOw0KICAgICAgICAgICAgZmlyZVByb3BlcnR5 Q2hhbmdlKCJj 
 aG9pY2VzIiwgb2xkLCBjaG9pY2VzKTsNCiAgICAgICAgfQ0KDQogICAgICAg IHB1YmxpYyBT 
 dHJpbmcgZ2V0VGV4dCgpIHsNCiAgICAgICAgICAgIHJldHVybiB0ZXh0Ow0K ICAgICAgICB9 
 DQoNCiAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkg ew0KICAgICAg 
 ICAJU3lzdGVtLm91dC5wcmludGxuKCJzZXRUZXh0KCIgKyB0ZXh0ICsgIiki KTsgLy8gRmly 
 ZXMgb25seSB1bmRlciAzLjQNCiAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1 ZSA9IHRoaXMu 
 dGV4dDsNCiAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7DQogICAgICAg ICAgICBmaXJl 
 UHJvcGVydHlDaGFuZ2UoInRleHQiLCBvbGRWYWx1ZSwgdGV4dCk7DQogICAg ICAgIH0NCiAg 
 ICB9DQoNCiAgICAvLyBUaGUgR1VJIHZpZXcNCiAgICBzdGF0aWMgY2xhc3Mg VmlldyB7DQog 
 ICAgICAgIHByaXZhdGUgVmlld01vZGVsIHZpZXdNb2RlbDsNCiAgICAgICAg LyoqDQogICAg 
 ICAgICAqIHVzZWQgdG8gbWFrZSBhIG5ldyBjaG9pY2VzIGFycmF5IHVuaXF1 ZQ0KICAgICAg 
 ICAgKi8NCiAgICAgICAgc3RhdGljIGludCBjb3VudDsNCg0KICAgICAgICBw dWJsaWMgVmll 
 dyhWaWV3TW9kZWwgdmlld01vZGVsKSB7DQogICAgICAgICAgICB0aGlzLnZp ZXdNb2RlbCA9 
 IHZpZXdNb2RlbDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBTaGVs bCBjcmVhdGVT 
 aGVsbCgpIHsNCiAgICAgICAgICAgIC8vIEJ1aWxkIGEgVUkNCiAgICAgICAg ICAgIFNoZWxs 
 IHNoZWxsID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsNCiAg ICAgICAgICAg 
 IHNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkp Ow0KDQogICAg 
 ICAgICAgICBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgU1dULkJP UkRFUiB8IFNX 
 VC5SRUFEX09OTFkpOw0KICAgICAgICAgICAgQnV0dG9uIHJlc2V0ID0gbmV3 IEJ1dHRvbihz 
 aGVsbCwgU1dULk5VTEwpOw0KICAgICAgICAgICAgcmVzZXQuc2V0VGV4dCgi cmVzZXQgY29s 
 bGVjdGlvbiIpOw0KICAgICAgICAgICAgcmVzZXQuYWRkU2VsZWN0aW9uTGlz dGVuZXIobmV3 
 IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQogICAgICAgICAgICAgICAgcHVibGlj IHZvaWQgd2lk 
 Z2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KICAgICAgICAgICAg ICAgICAgICBM 
 aXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQogICAgICAgICAgICAg ICAgICAgIG5l 
 d0xpc3QuYWRkKCJDaG9jb2xhdGUiKTsNCiAgICAgICAgICAgICAgICAgICAg bmV3TGlzdC5h 
 ZGQoIlZhbmlsbGEiKTsNCiAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5h ZGQoIk1hbmdv 
 IFBhcmZhaXQiKTsNCiAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQo ImJlZWYiKTsN 
 CiAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQoIkNoZWVzZWNha2Ui KTsNCiAgICAg 
 ICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQoSW50ZWdlci50b1N0cmluZygr K2NvdW50KSk7 
 DQogICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbC5zZXRDaG9pY2VzKG5l d0xpc3QpOw0K 
 ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KDQogICAgICAg ICAgICAvLyBQ 
 cmludCB2YWx1ZSBvdXQgZmlyc3QNCiAgICAgICAgICAgIFN5c3RlbS5vdXQu cHJpbnRsbih2 
 aWV3TW9kZWwuZ2V0VGV4dCgpKTsNCg0KICAgICAgICAgICAgRGF0YUJpbmRp bmdDb250ZXh0 
 IGRiYyA9IG5ldyBEYXRhQmluZGluZ0NvbnRleHQoKTsNCiAgICAgICAgICAg IA0KICAgICAg 
 ICAgICAgZGJjLmJpbmRMaXN0KFNXVE9ic2VydmFibGVzLm9ic2VydmVJdGVt cyhjb21ibyks 
 IEJlYW5zT2JzZXJ2YWJsZXMub2JzZXJ2ZUxpc3QoUmVhbG0uZ2V0RGVmYXVs dCgpLCB2aWV3 
 TW9kZWwsICJjaG9pY2VzIiksIG51bGwsIG51bGwpOw0KICAgICAgICAgICAg ZGJjLmJpbmRW 
 YWx1ZShTV1RPYnNlcnZhYmxlcy5vYnNlcnZlU2VsZWN0aW9uKGNvbWJvKSwg QmVhbnNPYnNl 
 cnZhYmxlcy5vYnNlcnZlVmFsdWUodmlld01vZGVsLCAidGV4dCIpLCBudWxs LCBudWxsKTsN 
 CiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gT3BlbiBhbmQgcmV0dXJu IHRoZSBTaGVs 
 bA0KICAgICAgICAgICAgc2hlbGwucGFjaygpOw0KICAgICAgICAgICAgc2hl bGwub3Blbigp 
 Ow0KICAgICAgICAgICAgcmV0dXJuIHNoZWxsOw0KICAgICAgICB9DQogICAg fQ0KfQ== 
--------------020902080207080905020201--
 |  
 |  
  |  
| Re: Databinding for Combo behaves differently in 3.4 [message #332445 is a reply to message #332436] | 
Tue, 21 October 2008 14:58    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
I ran the code using 3.3.2 and 3.4.1 but did not notice any difference.  
Could you please file a bug against Eclipse Platform UI and provide more  
detailed steps what I should do with the snippet once I have it running?  
Writing down the expected and actual behaviour in both environments would be  
good too. 
 
Thanks 
Boris 
 
"Alex Molochnikov" <alexm@xxx.yyy> wrote in message  
news:gdl50i$68a$1@build.eclipse.org... 
> The change in behavior between Eclipse 3.3 and 3.4 is significant and 
> breaks the existing logic. 
> 
> Here is what happens: a data model carries an array of String items 
> (colourScales) that populate the Combo's drop-down list, and a single 
> String (colorScale) to track its selection. 
> 
> 
> When the data model is bound to a Combo box, as below 
> 
> Combo colorScale = ... 
> DataBindingContext dbc = ... 
> dbc.bindList(SWTObservables.observeItems(colorScale), 
> BeansObservables.observeList(Realm.getDefault(), dataModel, 
> "colourScales"), null, null); 
> 
> the Combo fires a text-change event, setting the model's colorScale 
> property to a blank value, and corrupting it as the result. 
> 
> In Eclipse 3.3, binding a Combo to an array of String items did not 
> trigger any change in the Combo's current selection (and it shouldn't  
> have). 
> 
> I slightly modified one of the databinding Snippets to demonstrate this 
> effect. Run the attached code under 3.3, and then under 3.4 to see the 
> difference. 
> 
> My questions are: 
> 
> 1. is this a planned change in behavior? 
> 2. if so, how can I prevent the undesirable side effect of changing the 
> data model's property when binding items to the Combo? 
> 
> Thanks for any clues. 
> 
> Alex Molochnikov 
> Kelman Technologies Inc. 
> 
 
 
 ------------------------------------------------------------ -------------------- 
 
 
>  /*********************************************************** ******************** 
> * Copyright (c) 2006 The Pampered Chef, Inc. and others. 
> * All rights reserved. This program and the accompanying materials 
> * are made available under the terms of the Eclipse Public License v1.0 
> * which accompanies this distribution, and is available at 
> * http://www.eclipse.org/legal/epl-v10.html 
> * 
> * Contributors: 
> *     The Pampered Chef, Inc. - initial API and implementation 
> *     Brad Reynolds - bug 116920 
>  ************************************************************ ******************/ 
> 
> package org.eclipse.jface.examples.databinding.snippets; 
> 
> import java.beans.PropertyChangeListener; 
> import java.beans.PropertyChangeSupport; 
> import java.util.ArrayList; 
> import java.util.List; 
> 
> import org.eclipse.core.databinding.DataBindingContext; 
> import org.eclipse.core.databinding.beans.BeansObservables; 
> import org.eclipse.core.databinding.observable.Realm; 
> import org.eclipse.jface.databinding.swt.SWTObservables; 
> import org.eclipse.swt.SWT; 
> import org.eclipse.swt.events.SelectionAdapter; 
> import org.eclipse.swt.events.SelectionEvent; 
> import org.eclipse.swt.layout.RowLayout; 
> import org.eclipse.swt.widgets.Button; 
> import org.eclipse.swt.widgets.Combo; 
> import org.eclipse.swt.widgets.Display; 
> import org.eclipse.swt.widgets.Shell; 
> 
> /** 
> * Shows how to bind a Combo so that when update its items, the selection  
> is 
> * retained if at all possible. 
> * 
> * @since 3.2 
> */ 
> public class Snippet002UpdateComboRetainSelection { 
>    public static void main(String[] args) { 
>    final Display display = new Display(); 
>    Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { 
>    public void run() { 
>    ViewModel viewModel = new ViewModel(); 
>    Shell shell = new View(viewModel).createShell(); 
> 
>    // The SWT event loop 
>    while (!shell.isDisposed()) { 
>    if (!display.readAndDispatch()) { 
>    display.sleep(); 
>    } 
>    } 
> 
>    // Print the results 
>    System.out.println(viewModel.getText()); 
>    } 
>    }); 
>    display.dispose(); 
>    } 
> 
>    // Minimal JavaBeans support 
>    public static abstract class AbstractModelObject { 
>        private PropertyChangeSupport propertyChangeSupport = new  
> PropertyChangeSupport(this); 
> 
>        public void addPropertyChangeListener(PropertyChangeListener  
> listener) { 
>            propertyChangeSupport.addPropertyChangeListener(listener); 
>        } 
> 
>        public void addPropertyChangeListener(String propertyName,  
> PropertyChangeListener listener) { 
>             propertyChangeSupport.addPropertyChangeListener(propertyName ,  
> listener); 
>        } 
> 
>        public void removePropertyChangeListener(PropertyChangeListener  
> listener) { 
>             propertyChangeSupport.removePropertyChangeListener(listener) ; 
>        } 
> 
>        public void removePropertyChangeListener(String propertyName,  
> PropertyChangeListener listener) { 
>  
>  propertyChangeSupport.removePropertyChangeListener(propertyN ame,  
> listener); 
>        } 
> 
>        protected void firePropertyChange(String propertyName, Object  
> oldValue, Object newValue) { 
>            propertyChangeSupport.firePropertyChange(propertyName,  
> oldValue, newValue); 
>        } 
>    } 
> 
>    // The View's model--the root of our Model graph for this particular  
> GUI. 
>    public static class ViewModel extends AbstractModelObject { 
>        private String text = "beef"; 
> 
>        private List choices = new ArrayList(); 
>        { 
>            choices.add("pork"); 
>            choices.add("beef"); 
>            choices.add("poultry"); 
>            choices.add("vegatables"); 
>        } 
> 
>        public List getChoices() { 
>            return choices; 
>        } 
> 
>        public void setChoices(List choices) { 
>            List old = this.choices; 
>            this.choices = choices; 
>            firePropertyChange("choices", old, choices); 
>        } 
> 
>        public String getText() { 
>            return text; 
>        } 
> 
>        public void setText(String text) { 
>        System.out.println("setText(" + text + ")"); // Fires only under  
> 3.4 
>            String oldValue = this.text; 
>            this.text = text; 
>            firePropertyChange("text", oldValue, text); 
>        } 
>    } 
> 
>    // The GUI view 
>    static class View { 
>        private ViewModel viewModel; 
>        /** 
>         * used to make a new choices array unique 
>         */ 
>        static int count; 
> 
>        public View(ViewModel viewModel) { 
>            this.viewModel = viewModel; 
>        } 
> 
>        public Shell createShell() { 
>            // Build a UI 
>            Shell shell = new Shell(Display.getCurrent()); 
>            shell.setLayout(new RowLayout(SWT.VERTICAL)); 
> 
>            Combo combo = new Combo(shell, SWT.BORDER | SWT.READ_ONLY); 
>            Button reset = new Button(shell, SWT.NULL); 
>            reset.setText("reset collection"); 
>            reset.addSelectionListener(new SelectionAdapter() { 
>                public void widgetSelected(SelectionEvent e) { 
>                    List newList = new ArrayList(); 
>                    newList.add("Chocolate"); 
>                    newList.add("Vanilla"); 
>                    newList.add("Mango Parfait"); 
>                    newList.add("beef"); 
>                    newList.add("Cheesecake"); 
>                    newList.add(Integer.toString(++count)); 
>                    viewModel.setChoices(newList); 
>                } 
>            }); 
> 
>            // Print value out first 
>            System.out.println(viewModel.getText()); 
> 
>            DataBindingContext dbc = new DataBindingContext(); 
> 
>            dbc.bindList(SWTObservables.observeItems(combo),  
> BeansObservables.observeList(Realm.getDefault(), viewModel, "choices"),  
> null, null); 
>            dbc.bindValue(SWTObservables.observeSelection(combo),  
> BeansObservables.observeValue(viewModel, "text"), null, null); 
> 
>            // Open and return the Shell 
>            shell.pack(); 
>            shell.open(); 
>            return shell; 
>        } 
>    } 
> }
 |  
 |  
  |   |   |   
Goto Forum:
 
 Current Time: Mon Nov 03 22:23:34 EST 2025 
 Powered by  FUDForum. Page generated in 0.50531 seconds  
 |