Bug 371289 - Add "active" context variables
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
index 7f0cbdb..50015f3 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
@@ -284,4 +284,23 @@
 	 * will have no effect.
 	 */
 	public void dispose();
+
+	/**
+	 * <STRONG>EXPERIMENTAL, DO NOT USE</STRONG>
+	 * Returns the value stored on the active leaf node of the context's tree.
+	 * @param clazz the class that needs to be found in the active context
+	 * @return an object corresponding to the given class, or <code>null</code>
+	 * @see IEclipseContext#getActiveLeaf()
+	 */
+	public <T> T getActive(Class<T> clazz);
+
+	/**
+	 * <STRONG>EXPERIMENTAL, DO NOT USE</STRONG>
+	 * Returns the named value stored on the active leaf node of the context's tree.
+	 * @param name the name of the value to return
+	 * @return an object corresponding to the given name, or <code>null</code>
+	 * @see IEclipseContext#getActiveLeaf()
+	 */
+	public Object getActive(final String name);
+
 }
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 5554941..c5cce87 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
@@ -693,4 +693,32 @@
 	protected Object lookup(String name, EclipseContext originatingContext) {
 		return null;
 	}
+
+	/**
+	 * Prefix used to distinguish active variables
+	 */
+	static private final String ACTIVE_VARIABLE = "org.eclipse.ui.active_"; //$NON-NLS-1$
+
+	public <T> T getActive(Class<T> clazz) {
+		return clazz.cast(getActive(clazz.getName()));
+	}
+
+	public Object getActive(final String name) {
+		final String internalName = ACTIVE_VARIABLE + name;
+		trackAccess(internalName);
+
+		if (containsKey(internalName, false))
+			return internalGet(this, internalName, false);
+
+		final EclipseContext originatingContext = this;
+		runAndTrack(new RunAndTrack() {
+			public boolean changed(IEclipseContext context) {
+				IEclipseContext activeContext = getRoot().getActiveLeaf();
+				Object result = activeContext.get(name);
+				originatingContext.set(internalName, result);
+				return true;
+			}
+		});
+		return internalGet(this, internalName, true);
+	}
 }