Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java22
-rw-r--r--bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ValueComputation.java5
2 files changed, 19 insertions, 8 deletions
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
index 25705f6d4..55d921f38 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
@@ -25,6 +25,7 @@ import java.util.Stack;
import org.eclipse.e4.core.contexts.IContextFunction;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
+import org.eclipse.e4.core.di.IInjector;
import org.eclipse.e4.core.internal.contexts.osgi.ContextDebugHelper;
/**
@@ -236,7 +237,7 @@ public class EclipseContext implements IEclipseContext {
* The given name has been modified or removed in this context. Invalidate all local value
* computations and listeners that depend on this name.
*/
- public void invalidate(String name, int eventType, Object oldValue, Set<Scheduled> scheduled) {
+ public void invalidate(String name, int eventType, Object oldValue, Object newValue, Set<Scheduled> scheduled) {
ContextChangeEvent event = new ContextChangeEvent(this, eventType, null, name, oldValue);
ValueComputation computation = localValueComputations.get(name);
if (computation != null) {
@@ -258,10 +259,19 @@ public class EclipseContext implements IEclipseContext {
// invalidate this name in child contexts
for (EclipseContext childContext : getChildren()) {
- childContext.invalidate(name, eventType, oldValue, scheduled);
+ // unless it is already set to the same value
+ if (eventType == ContextChangeEvent.ADDED && childContext.isLocalEquals(name, newValue))
+ continue;
+ childContext.invalidate(name, eventType, oldValue, newValue, scheduled);
}
}
+ protected boolean isLocalEquals(String name, Object newValue) {
+ if (!localValues.containsKey(name))
+ return false;
+ return (localValues.get(name) == newValue);
+ }
+
private boolean isSetLocally(String name) {
return localValues.containsKey(name);
}
@@ -270,7 +280,7 @@ public class EclipseContext implements IEclipseContext {
if (isSetLocally(name)) {
Object oldValue = localValues.remove(name);
Set<Scheduled> scheduled = new LinkedHashSet<Scheduled>();
- invalidate(name, ContextChangeEvent.REMOVED, oldValue, scheduled);
+ invalidate(name, ContextChangeEvent.REMOVED, oldValue, IInjector.NOT_A_VALUE, scheduled);
processScheduled(scheduled);
}
}
@@ -308,7 +318,7 @@ public class EclipseContext implements IEclipseContext {
Object oldValue = localValues.put(name, value);
if (!containsKey || value != oldValue) {
Set<Scheduled> scheduled = new LinkedHashSet<Scheduled>();
- invalidate(name, ContextChangeEvent.ADDED, oldValue, scheduled);
+ invalidate(name, ContextChangeEvent.ADDED, oldValue, value, scheduled);
processScheduled(scheduled);
}
}
@@ -329,7 +339,7 @@ public class EclipseContext implements IEclipseContext {
}
Object oldValue = localValues.put(name, value);
if (value != oldValue)
- invalidate(name, ContextChangeEvent.ADDED, oldValue, scheduled);
+ invalidate(name, ContextChangeEvent.ADDED, oldValue, value, scheduled);
return true;
}
@@ -444,7 +454,7 @@ public class EclipseContext implements IEclipseContext {
Object oldValue = get(name);
Object newValue = (newParent != null) ? newParent.get(name) : null;
if (oldValue != newValue)
- invalidate(name, ContextChangeEvent.ADDED, oldValue, scheduled);
+ invalidate(name, ContextChangeEvent.ADDED, oldValue, newValue, scheduled);
}
ContextChangeEvent event = new ContextChangeEvent(this, ContextChangeEvent.ADDED, null, null, null);
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ValueComputation.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ValueComputation.java
index ec994d2bc..6f567c059 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ValueComputation.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ValueComputation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -13,6 +13,7 @@ package org.eclipse.e4.core.internal.contexts;
import java.util.Set;
import org.eclipse.e4.core.contexts.IContextFunction;
import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.IInjector;
import org.eclipse.e4.core.internal.contexts.EclipseContext.Scheduled;
public class ValueComputation extends Computation {
@@ -37,7 +38,7 @@ public class ValueComputation extends Computation {
if (cachedValue == NotAValue) // already invalidated
return;
cachedValue = NotAValue;
- originatingContext.invalidate(name, ContextChangeEvent.RECALC, event.getOldValue(), scheduled);
+ originatingContext.invalidate(name, ContextChangeEvent.RECALC, event.getOldValue(), IInjector.NOT_A_VALUE, scheduled);
}
public boolean shouldRemove(ContextChangeEvent event) {

Back to the top