Bug 536677 - dispose WorkbenchMenuService contributions on part disposal
Since we don't always have direct reference to the WorkbenchMenuService,
and it makes no sense to provide a public interface for a bug (537046)
in the design, we define internal IMenuServiceWorkaround interface and
let SlaveMenuService and WorkbenchMenuService implement it.
Change-Id: I21a2a592b1305b955d2d1814f2845a84bda0a681
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IMenuServiceWorkaround.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IMenuServiceWorkaround.java
new file mode 100644
index 0000000..eb636b8
--- /dev/null
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IMenuServiceWorkaround.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 20118 Andrey Loskutov.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal;
+
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+
+/**
+ * Workaround for bug 537046
+ */
+public interface IMenuServiceWorkaround {
+
+ /**
+ * Disposes contributions created by service for given part. See bug 537046.
+ *
+ * @param site
+ * @param part
+ */
+ void clearContributions(PartSite site, MPart part);
+
+}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java
index 117aff8..1ea1dc0 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java
@@ -43,11 +43,11 @@
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.ActionDescriptor;
+import org.eclipse.ui.internal.IMenuServiceWorkaround;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.internal.ViewActionBuilder;
import org.eclipse.ui.internal.ViewReference;
import org.eclipse.ui.internal.WorkbenchPartReference;
-import org.eclipse.ui.internal.menus.WorkbenchMenuService;
import org.eclipse.ui.internal.registry.ViewDescriptor;
import org.eclipse.ui.internal.testing.ContributionInfoMessages;
import org.eclipse.ui.menus.IMenuService;
@@ -277,10 +277,10 @@
private static void clearMenuServiceContributions(PartSite site, MPart part) {
IMenuService menuService = site.getService(IMenuService.class);
- if (!(menuService instanceof WorkbenchMenuService)) {
+ if (!(menuService instanceof IMenuServiceWorkaround)) {
return;
}
- WorkbenchMenuService service = (WorkbenchMenuService) menuService;
+ IMenuServiceWorkaround service = (IMenuServiceWorkaround) menuService;
service.clearContributions(site, part);
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/SlaveMenuService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/SlaveMenuService.java
index 8debb38..a8b5f4c 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/SlaveMenuService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/SlaveMenuService.java
@@ -13,8 +13,11 @@
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.e4.ui.model.application.MApplicationElement;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.ui.ISourceProvider;
+import org.eclipse.ui.internal.IMenuServiceWorkaround;
+import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.menus.AbstractContributionFactory;
import org.eclipse.ui.menus.IMenuService;
@@ -22,7 +25,7 @@
* @since 3.105
*
*/
-public class SlaveMenuService implements IMenuService {
+public class SlaveMenuService implements IMenuService, IMenuServiceWorkaround {
private IMenuService parentService;
/**
@@ -100,6 +103,20 @@
}
/**
+ * Disposes contributions created by service for given part. See bug 537046.
+ *
+ * @param site
+ * @param part
+ */
+ @Override
+ public void clearContributions(PartSite site, MPart part) {
+ if (parentService instanceof IMenuServiceWorkaround) {
+ IMenuServiceWorkaround service = (IMenuServiceWorkaround) parentService;
+ service.clearContributions(site, part);
+ }
+ }
+
+ /**
* @return
* @see org.eclipse.ui.menus.IMenuService#getCurrentState()
*/
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java
index 4b831af..5c8c317 100755
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java
@@ -55,6 +55,7 @@
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.IMenuServiceWorkaround;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.WorkbenchWindow;
@@ -68,7 +69,7 @@
* @since 3.5
*
*/
-public class WorkbenchMenuService implements IMenuService {
+public class WorkbenchMenuService implements IMenuService, IMenuServiceWorkaround {
private static final String POPULATED_TOOL_BARS = "populatedToolBars"; //$NON-NLS-1$
private static final String POPULATED_MENUS = "populatedMenus"; //$NON-NLS-1$
@@ -481,6 +482,7 @@
* @param site
* @param part
*/
+ @Override
public void clearContributions(PartSite site, MPart part) {
List<MToolBar> toolbars = getContributedToolbars(part);
IEclipseContext context = part.getContext();