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);