| Summary: | [DataBinding] [JFace] setting ObservableListContentProvider on ComboViewer twice throws NPE | ||||||
|---|---|---|---|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Henno Vermeulen <strider80> | ||||
| Component: | UI | Assignee: | Matthew Hall <qualidafial> | ||||
| Status: | RESOLVED WONTFIX | QA Contact: | Matthew Hall <qualidafial> | ||||
| Severity: | minor | ||||||
| Priority: | P3 | CC: | tango17 | ||||
| Version: | 4.0 | ||||||
| Target Milestone: | --- | ||||||
| Hardware: | PC | ||||||
| OS: | Windows 7 | ||||||
| Whiteboard: | |||||||
| Attachments: |
|
||||||
|
Description
Henno Vermeulen
Created attachment 175477 [details] Self contained snippet which shows Bug 321209 SlowStrider: the problem is that when you set a new content provider on a ContentViewer, the viewer disposes the old IContentProvider before setting up the new one. However you're wrapping the old content provider in the new one, so by the time the new one is getting initialized, the provider it wraps is disposed and no longer safe to use.
viewer.setContentProvider(new ObservableListContentProvider());
viewer.setInput(new WritableList(Arrays.asList("male", "female"),
String.class));
// Throws a NullPointerException in a jface databinding internal class.
// Workaround: set the decorated content provider when first
// calling viewer.setContentProvider.
viewer.setContentProvider(
new NullElementStructuredContentProviderDecorator(
(IStructuredContentProvider) viewer.getContentProvider()));
A safer workaround is to just use a new Observable<List|Set>ContentProvider instance each time you change the content provider:
viewer.setContentProvider(
new NullElementStructuredContentProviderDecorator(
new ObservableListContentProvider()));
And this will definitely break with the DataBinding content providers:
viewer.setContentProvider(viewer.getContentProvider());
I've added documentation to the Observable(List|Set)(Tree)?ContentProvider.dispose() methods explaining that they become unusable after disposal, and that the viewer disposes replaced content providers.
|