diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java index ed2aaf2ed..b7e332e60 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/LaunchManagerProxy.java @@ -10,6 +10,11 @@ *******************************************************************************/ package org.eclipse.debug.internal.ui.viewers.update; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchManager; @@ -22,6 +27,11 @@ import org.eclipse.debug.internal.ui.viewers.provisional.ModelDelta; public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesListener2 { private ILaunchManager fLaunchManager; + /** + * Map of each launch to its previous children. When a child is added, + * its model proxy is installed. + */ + private Map fPrevChildren = new HashMap(); /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.AbstractModelProxy#init(org.eclipse.debug.internal.ui.viewers.IPresentationContext) @@ -38,9 +48,7 @@ public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesL public void installed() { // expand existing launches ILaunch[] launches = fLaunchManager.getLaunches(); - if (launches.length > 0) { - fireDelta(launches, IModelDelta.EXPAND); - } + launchesAdded(launches); } /* (non-Javadoc) @@ -64,6 +72,10 @@ public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesL */ public void launchesRemoved(ILaunch[] launches) { fireDelta(launches, IModelDelta.REMOVED); + // clear the children cache + for (int i = 0; i < launches.length; i++) { + fPrevChildren.remove(launches[i]); + } } /* (non-Javadoc) @@ -71,6 +83,12 @@ public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesL */ public void launchesAdded(ILaunch[] launches) { fireDelta(launches, IModelDelta.ADDED | IModelDelta.EXPAND); + // install model proxies + for (int i = 0; i < launches.length; i++) { + ILaunch launch = launches[i]; + fPrevChildren.put(launch, new HashSet()); + } + installModelProxies(launches); } /* (non-Javadoc) @@ -78,6 +96,34 @@ public class LaunchManagerProxy extends AbstractModelProxy implements ILaunchesL */ public void launchesChanged(ILaunch[] launches) { fireDelta(launches, IModelDelta.STATE | IModelDelta.CONTENT); + // install model proxies for new children + installModelProxies(launches); + } + + /** + * Installs model proxies for any new children in the given launches. + * + * @param launches + */ + protected void installModelProxies(ILaunch[] launches) { + boolean changes = false; + ModelDelta root = new ModelDelta(fLaunchManager, IModelDelta.NO_CHANGE); + for (int i = 0; i < launches.length; i++) { + ILaunch launch = launches[i]; + ModelDelta launchDelta = root.addNode(launch, IModelDelta.NO_CHANGE); + Object[] children = launch.getChildren(); + Set set = (Set) fPrevChildren.get(launch); + for (int j = 0; j < children.length; j++) { + Object child = children[j]; + if (set.add(child)) { + changes = true; + launchDelta.addNode(child, IModelDelta.INSTALL); + } + } + } + if (changes) { + fireModelChanged(root); + } } protected void fireDelta(ILaunch[] launches, int launchFlags) { |