Bug 125536 - selection not revealed when item not populated
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousModel.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousModel.java
index 64a6bf6..5af01f3 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousModel.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousModel.java
@@ -110,18 +110,16 @@
 	 * 
 	 * @param element element to install an update policy for
 	 */
-	public void installModelProxy(Object element) {
-		synchronized (fModelProxies) {
-			if (!fModelProxies.containsKey(element)) {
-				IModelProxyFactoryAdapter modelProxyFactory = getModelProxyFactoryAdapter(element);
-				if (modelProxyFactory != null) {
-					IModelProxy proxy = modelProxyFactory.createModelProxy(element, getPresentationContext());
-					if (proxy != null) {
-						proxy.init(getPresentationContext());
-						fModelProxies.put(element, proxy);
-						getViewer().modelProxyAdded(proxy);
-						proxy.installed();
-					}
+	public synchronized void installModelProxy(Object element) {
+		if (!fModelProxies.containsKey(element)) {
+			IModelProxyFactoryAdapter modelProxyFactory = getModelProxyFactoryAdapter(element);
+			if (modelProxyFactory != null) {
+				IModelProxy proxy = modelProxyFactory.createModelProxy(element, getPresentationContext());
+				if (proxy != null) {
+					proxy.init(getPresentationContext());
+					fModelProxies.put(element, proxy);
+					getViewer().modelProxyAdded(proxy);
+					proxy.installed();
 				}
 			}
 		}
@@ -132,13 +130,11 @@
 	 * 
 	 * @param element
 	 */
-	protected void disposeModelProxy(Object element) {
-		synchronized (fModelProxies) {
-			IModelProxy proxy = (IModelProxy) fModelProxies.remove(element);
-			if (proxy != null) {
-				getViewer().modelProxyRemoved(proxy);
-				proxy.dispose();
-			}
+	protected synchronized void disposeModelProxy(Object element) {
+		IModelProxy proxy = (IModelProxy) fModelProxies.remove(element);
+		if (proxy != null) {
+			getViewer().modelProxyRemoved(proxy);
+			proxy.dispose();
 		}
 	}	
 	
@@ -209,6 +205,11 @@
 		if (nodes == null) {
 			fElementToNodes.put(element, new ModelNode[] { node});
 		} else {
+			for (int i = 0; i < nodes.length; i++) {
+				if (nodes[i] == node) {
+					return;
+				}
+			}
 			ModelNode[] old = nodes;
 			ModelNode[] newNodes = new ModelNode[old.length + 1];
 			System.arraycopy(old, 0, newNodes, 0, old.length);
@@ -486,6 +487,7 @@
 	 * @param kids list of model elements
 	 */
 	protected void setChildren(final ModelNode parentNode, List kids) {
+		
         final Object[] children = filter(parentNode.getElement(), kids.toArray());
         final AsynchronousModelViewer viewer = getViewer();
         ViewerSorter sorter = viewer.getSorter();
@@ -529,8 +531,8 @@
     					Object nextChild = children[i];
     					if (!prevNode.getElement().equals(nextChild)) {
     						unmapNode(prevNode);
-    						mapElement(nextChild, prevNode);
     					}
+    					mapElement(nextChild, prevNode);
     				}
     			}
     			// create new children
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousTreeModelViewer.java
index fdd6d56..a3ef4bb 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousTreeModelViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/viewers/AsynchronousTreeModelViewer.java
@@ -425,10 +425,13 @@
      * @param node
      */
     protected void nodeContainerChanged(ModelNode node) {
-        Widget widget = node.getWidget();
+         Widget widget = node.getWidget();
         if (widget != null && !widget.isDisposed()) {
             if (isVisible(widget)) {
                 boolean expanded = true;
+                if (node.isContainer() && getItemCount(widget) == 0) {
+                	setItemCount(widget, 1);
+                }
                 if (widget instanceof TreeItem) {
                     expanded = ((TreeItem)widget).getExpanded();
                 }
@@ -440,6 +443,13 @@
         attemptExpansion();
         attemptSelection(false);
     }
+    
+    protected int getItemCount(Widget widget) {
+    	if (widget instanceof TreeItem) {
+			return ((TreeItem) widget).getItemCount();
+		}
+    	return ((Tree) widget).getItemCount();
+    }
 
     protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
         super.doUpdateItem(item, element, fullMap);