Bug 435274 - [Contributions] Leak of ActionContributionItem every time
New/Import context menu item is made visible
Fix cleans up child menus which were previously missed.
Change-Id: I13038adf28a0fef85a60cc7ccf78a98ba8cddb13
Signed-off-by: Patrick Naish <patrick.naish@microfocus.com>
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java
index 07c7dd2..cb1a3a8 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java
@@ -10,6 +10,8 @@
* Marco Descher <marco@descher.at> - Bug 389063, Bug 398865, Bug 398866, Bug 405471
* Sopot Cela <sopotcela@gmail.com>
* Steven Spungin <steven@spungin.tv> - Bug 437747
+ * Alan Staves <alan.staves@microfocus.com> - Bug 435274
+ * Patrick Naish <patrick.naish@microfocus.com> - Bug 435274
*******************************************************************************/
package org.eclipse.e4.ui.workbench.renderers.swt;
@@ -99,6 +101,7 @@
@Inject
IEventBroker eventBroker;
+
private EventHandler itemUpdater = new EventHandler() {
@Override
public void handleEvent(Event event) {
@@ -399,6 +402,11 @@
* @param menuModel
*/
public void cleanUp(MMenu menuModel) {
+ for (MMenuElement childElement : menuModel.getChildren()) {
+ if (childElement instanceof MMenu) {
+ cleanUp((MMenu) childElement);
+ }
+ }
Collection<ContributionRecord> vals = modelContributionToRecord
.values();
List<ContributionRecord> disposedRecords = new ArrayList<ContributionRecord>();
@@ -859,6 +867,10 @@
}
public void clearModelToManager(MMenu model, MenuManager manager) {
+ for (MMenuElement element : model.getChildren()) {
+ IContributionItem ici = getContribution(element);
+ clearModelToContribution(element, ici);
+ }
modelToManager.remove(model);
managerToModel.remove(manager);
}