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