| Deferred content provider [message #897599] |
Tue, 24 July 2012 12:31  |
Fabio Mancinelli Messages: 16 Registered: July 2009 |
Junior Member |
|
|
Hi everybody,
I have a weird problem with a deferred content provider and a TreeViewer.
I use it in order to lazily retrieve data from a remote server.
Globally it works quite well but sometimes when I expand a node it
returns to its not-expanded state just after removing the "Pending..."
placeholder.
I have to re-expand it to actually see the content (sometimes repeatedly)
I have put some println in the IElementCollector I use for collecting
items and they are retrieved correctly but, as I said before, sometimes
they are not displayed.
Has anyone ever had this problem?
Thanks for your help,
Fabio
|
|
|
|
|
|
|
| Re: Deferred content provider [message #897750 is a reply to message #897742] |
Wed, 25 July 2012 04:14   |
Fabio Mancinelli Messages: 16 Registered: July 2009 |
Junior Member |
|
|
On 07/25/2012 09:58 AM, Jan Krakora wrote:
> Could you post here your IElementCollector implementation and the
> content of the fetchDeferredChildren method?
Sure.
Here it is my fetchDeferredChildren method:
public void fetchDeferredChildren(Object object, IElementCollector
collector, IProgressMonitor monitor) {
collector.add(getChildren(object), monitor);
collector.done();
}
getChildren does the heavy work and when it's done it returns the array
with the retrieved objects.
And this is the class that wraps the standard deferred content manager
in order to use an element collector that filters things wrt the
selected working set.
public class WorkingSetDeferredTreeContentManager extends
DeferredTreeContentManager
{
private IWorkingSet workingSet;
private static class WorkingSetElementCollectorFilter implements
IElementCollector
{
private IWorkingSet workingSet;
private IElementCollector elementCollector;
public WorkingSetElementCollectorFilter(IWorkingSet workingSet,
IElementCollector elementCollector)
{
this.workingSet = workingSet;
this.elementCollector = elementCollector;
}
public void add(Object element, IProgressMonitor monitor)
{
if (workingSet != null) {
if (UIUtils.isInWorkingSet(element, workingSet)) {
elementCollector.add(element, monitor);
}
} else {
elementCollector.add(element, monitor);
}
}
public void add(Object[] elements, IProgressMonitor monitor)
{
Object[] filteredObjects = null;
if (workingSet != null) {
filteredObjects = UIUtils.filterByWorkingSet(elements,
workingSet);
} else {
filteredObjects = elements;
}
elementCollector.add(filteredObjects, monitor);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
public void done()
{
elementCollector.done();
}
}
public WorkingSetDeferredTreeContentManager(AbstractTreeViewer
viewer, IWorkingSet workingSet)
{
super(null, viewer);
this.workingSet = workingSet;
}
@Override
protected IElementCollector createElementCollector(Object parent,
PendingUpdateAdapter placeholder)
{
IElementCollector elementCollector =
super.createElementCollector(parent, placeholder);
return new WorkingSetElementCollectorFilter(workingSet,
elementCollector);
}
}
-Fabio
|
|
|
|
|
|
|
|
| Re: Deferred content provider [message #898436 is a reply to message #898429] |
Thu, 26 July 2012 07:38  |
Fabio Mancinelli Messages: 16 Registered: July 2009 |
Junior Member |
|
|
On 07/26/2012 01:32 PM, Jan Krakora wrote:
> I would try to debug the WorkbenchJob in the DeferredTreeContentManager
> at the line 353. This should call your label provider.
Thanks for the hint... I will look into this.
-Fabio
|
|
|
Powered by
FUDForum. Page generated in 0.02409 seconds