### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.workbench Index: Eclipse UI/org/eclipse/ui/internal/PluginActionSetBuilder.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PluginActionSetBuilder.java,v retrieving revision 1.37 diff -u -r1.37 PluginActionSetBuilder.java --- Eclipse UI/org/eclipse/ui/internal/PluginActionSetBuilder.java 24 Aug 2009 19:24:10 -0000 1.37 +++ Eclipse UI/org/eclipse/ui/internal/PluginActionSetBuilder.java 8 Sep 2009 19:06:24 -0000 @@ -12,8 +12,10 @@ import java.util.ArrayList; import java.util.Iterator; - +import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; import org.eclipse.jface.action.AbstractGroupMarker; import org.eclipse.jface.action.ActionContributionItem; @@ -224,12 +226,24 @@ // pass the adjunct contributions will be processed. PluginActionSetBuilder[] builders = new PluginActionSetBuilder[pluginActionSets .size()]; + resetPendingWirings(new ArrayList()); for (int i = 0; i < pluginActionSets.size(); i++) { PluginActionSet set = (PluginActionSet) pluginActionSets.get(i); PluginActionSetBuilder builder = new PluginActionSetBuilder(); builder.readActionExtensions(set, window); builders[i] = builder; } + List pendingWirings = resetPendingWirings(null); + int size; + while ((size = pendingWirings.size()) > 0) { + ((Runnable) pendingWirings.get(0)).run(); + if (pendingWirings.size() == size) { + WorkbenchPlugin.log(new Status(IStatus.ERROR, + WorkbenchPlugin.PI_WORKBENCH, + "Unmet dependencies among menu actions")); //$NON-NLS-1$ + break; + } + } for (int i = 0; i < builders.length; i++) { PluginActionSetBuilder builder = builders[i]; builder.processAdjunctContributions(); Index: Eclipse UI/org/eclipse/ui/internal/PluginActionBuilder.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PluginActionBuilder.java,v retrieving revision 1.29 diff -u -r1.29 PluginActionBuilder.java --- Eclipse UI/org/eclipse/ui/internal/PluginActionBuilder.java 6 Oct 2008 17:49:14 -0000 1.29 +++ Eclipse UI/org/eclipse/ui/internal/PluginActionBuilder.java 8 Sep 2009 19:06:23 -0000 @@ -12,7 +12,7 @@ package org.eclipse.ui.internal; import java.util.ArrayList; - +import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.AbstractGroupMarker; @@ -345,8 +345,8 @@ /** * Contributes action from action descriptor into the provided menu manager. */ - protected void contributeMenuAction(ActionDescriptor ad, - IMenuManager menu, boolean appendIfMissing) { + protected void contributeMenuAction(final ActionDescriptor ad, + final IMenuManager menu, final boolean appendIfMissing) { // Get config data. String mpath = ad.getMenuPath(); String mgroup = ad.getMenuGroup(); @@ -358,7 +358,15 @@ if (mpath != null) { parent = parent.findMenuUsingPath(mpath); if (parent == null) { - ideLog("Plug-in '" + ad.getPluginId() + "' contributed an invalid Menu Extension (Path: '" + mpath + "' is invalid): " + ad.getId()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + if (pendingWirings != null) { + final List currentList = pendingWirings; + pendingWirings.add(new Runnable() { + public void run() { + contributeMenuAction(ad, menu, appendIfMissing); + currentList.remove(this); + } + }); + } return; } } @@ -523,6 +531,20 @@ } } + static List/*