Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java52
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) {

Back to the top