### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.workbench Index: Eclipse UI/org/eclipse/ui/actions/CompoundContributionItem.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/actions/CompoundContributionItem.java,v retrieving revision 1.8 diff -u -r1.8 CompoundContributionItem.java --- Eclipse UI/org/eclipse/ui/actions/CompoundContributionItem.java 28 May 2007 13:17:34 -0000 1.8 +++ Eclipse UI/org/eclipse/ui/actions/CompoundContributionItem.java 6 May 2009 17:33:35 -0000 @@ -13,11 +13,13 @@ import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IContributionManager; -import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuListener2; import org.eclipse.jface.action.IMenuManager; import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.ui.PlatformUI; /** * A compound contribution is a contribution item consisting of a @@ -29,11 +31,15 @@ private boolean dirty = true; - private IMenuListener menuListener = new IMenuListener() { + private IMenuListener2 menuListener = new IMenuListener2() { public void menuAboutToShow(IMenuManager manager) { manager.markDirty(); dirty = true; } + + public void menuAboutToHide(IMenuManager manager) { + disposeOldItems(); + } }; private IContributionItem[] oldItems; @@ -91,16 +97,27 @@ protected abstract IContributionItem[] getContributionItems(); private IContributionItem[] getContributionItemsToFill() { - if (oldItems != null) { - for (int i = 0; i < oldItems.length; i++) { - IContributionItem oldItem = oldItems[i]; - oldItem.dispose(); - } - oldItems = null; - } - oldItems = getContributionItems(); - return oldItems; - } + oldItems = getContributionItems(); + return oldItems; + } + + private void disposeOldItems() { + if (oldItems == null) { + return; + } + final Display display = PlatformUI.getWorkbench().getDisplay(); + final IContributionItem[] itemsToDispose = oldItems; + oldItems = null; + final Runnable dispose = new Runnable() { + public void run() { + for (int i = 0; i < itemsToDispose.length; i++) { + IContributionItem oldItem = itemsToDispose[i]; + oldItem.dispose(); + } + } + }; + display.asyncExec(dispose); + } /* (non-Javadoc) * @see org.eclipse.jface.action.ContributionItem#isDirty()