From 5923ec738638484e8a724cefba13a7410d4f8771 Mon Sep 17 00:00:00 2001 From: David McKnight Date: Wed, 18 Apr 2007 17:34:00 +0000 Subject: [PATCH] [182574] prevent duplicate deferred queries to avoid empty list scenario. --- .../SystemDeferredTreeContentManager.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/operations/SystemDeferredTreeContentManager.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/operations/SystemDeferredTreeContentManager.java index 4102edc06de..b50df58b204 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/operations/SystemDeferredTreeContentManager.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/operations/SystemDeferredTreeContentManager.java @@ -13,20 +13,27 @@ ********************************************************************************/ package org.eclipse.rse.ui.operations; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.rse.ui.view.IContextObject; import org.eclipse.ui.progress.DeferredTreeContentManager; import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; +import org.eclipse.ui.progress.PendingUpdateAdapter; public class SystemDeferredTreeContentManager extends DeferredTreeContentManager { + private List _pendingQueries; + public SystemDeferredTreeContentManager(ITreeContentProvider provider, AbstractTreeViewer viewer) { super(provider, viewer); - // TODO Auto-generated constructor stub + _pendingQueries = new ArrayList(); } /** @@ -47,4 +54,36 @@ public class SystemDeferredTreeContentManager extends return super.getAdapter(element); } + /** + * Returns the child elements of the given element, or in the case of a + * deferred element, returns a placeholder. If a deferred element is used, a + * job is created to fetch the children in the background. + * + * @param parent + * The parent object. + * @return Object[] or null if parent is not an instance of + * IDeferredWorkbenchAdapter. + */ + public Object[] getChildren(final Object parent) { + IDeferredWorkbenchAdapter element = getAdapter(parent); + if (element == null) { + return null; + } + PendingUpdateAdapter placeholder = createPendingUpdateAdapter(); + + if (!_pendingQueries.contains(parent)) + { + startFetchingDeferredChildren(parent, element, placeholder); + _pendingQueries.add(parent); + return new Object[] { placeholder }; + } + return null; + } + + protected void addChildren(final Object parent, final Object[] children, + IProgressMonitor monitor) + { + super.addChildren(parent, children, monitor); + _pendingQueries.remove(parent); + } }