Bug 348817 - WTP Source Editing Source/Refactor menus are visible and empty
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
index e06ca54..99d339f 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
@@ -70,10 +70,37 @@
 import org.eclipse.swt.widgets.Widget;
 
 public class HandledContributionItem extends ContributionItem {
-	static class ToolItemUpdateTimer implements Runnable {
+	static class RunnableRunner implements ISafeRunnable {
+		private Runnable runnable;
+
+		public void setRunnable(Runnable r) {
+			runnable = r;
+		}
+
+		public void handleException(Throwable exception) {
+			// Do not report these exceptions ATM
+		}
+
+		public void run() throws Exception {
+			runnable.run();
+		}
+
+	}
+
+	public static class ToolItemUpdateTimer implements Runnable {
 		Display display = Display.getCurrent();
+		RunnableRunner runner = new RunnableRunner();
 
 		List<HandledContributionItem> itemsToCheck = new ArrayList<HandledContributionItem>();
+		List<Runnable> windowRunnables = new ArrayList<Runnable>();
+
+		public void addWindowRunnable(Runnable r) {
+			windowRunnables.add(r);
+		}
+
+		public void removeWindowRunnable(Runnable r) {
+			windowRunnables.remove(r);
+		}
 
 		void registerItem(HandledContributionItem item) {
 			if (!itemsToCheck.contains(item)) {
@@ -90,11 +117,17 @@
 		}
 
 		public void run() {
-
 			for (HandledContributionItem hci : itemsToCheck) {
 				hci.updateItemEnablement();
 			}
 
+			Runnable[] array = new Runnable[windowRunnables.size()];
+			windowRunnables.toArray(array);
+			for (Runnable r : array) {
+				runner.setRunnable(r);
+				SafeRunner.run(runner);
+			}
+
 			// repeat until the list goes empty
 			if (itemsToCheck.size() > 0)
 				display.timerExec(400, this);
@@ -102,7 +135,7 @@
 	}
 
 	// HACK!! local 'static' timerExec...should move out of this class post 4.1
-	static ToolItemUpdateTimer toolItemUpdater = new ToolItemUpdateTimer();
+	public static ToolItemUpdateTimer toolItemUpdater = new ToolItemUpdateTimer();
 
 	private static final String DISPOSABLE_CHECK = "IDisposable"; //$NON-NLS-1$
 	private static final String WW_SUPPORT = "org.eclipse.ui.IWorkbenchWindow"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java
index 7c56bd6..24195ac 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java
@@ -109,9 +109,6 @@
 	@Inject
 	private MenuManagerRenderer renderer;
 
-	@Inject
-	private EHandlerService handlerService;
-
 	private HashMap<Menu, Runnable> pendingCleanup = new HashMap<Menu, Runnable>();
 
 	private class SafeWrapper implements ISafeRunnable {
@@ -285,7 +282,7 @@
 	 * @param menuManager
 	 * @param evalContext
 	 */
-	private void updateElementVisibility(final MMenu menuModel,
+	public static void updateElementVisibility(final MMenu menuModel,
 			MenuManagerRenderer renderer, MenuManager menuManager,
 			final IEclipseContext evalContext, boolean recurse) {
 		final ExpressionContext exprContext = new ExpressionContext(evalContext);
@@ -312,7 +309,9 @@
 			if (element instanceof MHandledMenuItem) {
 				ParameterizedCommand cmd = ((MHandledMenuItem) element)
 						.getWbCommand();
-				if (cmd != null) {
+				EHandlerService handlerService = evalContext
+						.get(EHandlerService.class);
+				if (cmd != null && handlerService != null) {
 					MHandledMenuItem item = (MHandledMenuItem) element;
 					final IEclipseContext staticContext = EclipseContextFactory
 							.create(MMRF_STATIC_CONTEXT);