Bug 366906 - [Compatibility] DirectContributionItem enablements never updated
Propagate changes from the actions into the corresponding model instances
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
index 119fbd0..58ee6b8 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
@@ -47,6 +47,9 @@
 import org.eclipse.swt.widgets.Widget;
 
 public class DirectContributionItem extends ContributionItem {
+	/** Internal key for transient maps to provide a runnable on widget disposal */
+	public static final String DISPOSABLE = "IDisposable"; //$NON-NLS-1$
+
 	private MItem model;
 	private Widget widget;
 	private Listener menuItemListener;
@@ -296,6 +299,10 @@
 			widget.removeListener(SWT.Dispose, getItemListener());
 			widget.removeListener(SWT.DefaultSelection, getItemListener());
 			widget = null;
+			Object obj = model.getTransientData().get(DISPOSABLE);
+			if (obj instanceof Runnable) {
+				((Runnable) obj).run();
+			}
 			model.setWidget(null);
 			disposeOldImages();
 		}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
index 1ee607e..365951a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
@@ -62,6 +62,7 @@
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
+import org.eclipse.e4.ui.workbench.renderers.swt.DirectContributionItem;
 import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.IMenuCreator;
@@ -800,7 +801,7 @@
 	}
 
 	public static MToolItem createToolItem(MApplication application, ActionContributionItem item) {
-		IAction action = item.getAction();
+		final IAction action = item.getAction();
 		String id = action.getActionDefinitionId();
 		if (id != null) {
 			for (MCommand command : application.getCommands()) {
@@ -845,7 +846,7 @@
 				}
 			}
 		} else {
-			MDirectToolItem toolItem = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
+			final MDirectToolItem toolItem = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 			String itemId = item.getId();
 			toolItem.setElementId(itemId);
 			String iconURI = getIconURI(action.getImageDescriptor(), application.getContext());
@@ -867,6 +868,9 @@
 			} else {
 				toolItem.setIconURI(iconURI);
 			}
+			if (action.getToolTipText() != null) {
+				toolItem.setTooltip(action.getToolTipText());
+			}
 
 			switch (action.getStyle()) {
 			case IAction.AS_CHECK_BOX:
@@ -883,6 +887,30 @@
 			}
 			toolItem.setContributionURI("platform:/plugin/org.eclipse.ui.workbench/programmic.contribution"); //$NON-NLS-1$
 			toolItem.setObject(new DirectProxy(action));
+			toolItem.setEnabled(action.isEnabled());
+
+			final IPropertyChangeListener propertyListener = new IPropertyChangeListener() {
+				public void propertyChange(PropertyChangeEvent event) {
+					String property = event.getProperty();
+					if (property.equals(IAction.ENABLED)) {
+						toolItem.setEnabled(action.isEnabled());
+					} else if (property.equals(IAction.CHECKED)) {
+						toolItem.setSelected(action.isChecked());
+					} else if (property.equals(IAction.TEXT)) {
+						toolItem.setLabel(action.getText());
+					} else if (property.equals(IAction.TOOL_TIP_TEXT)) {
+						toolItem.setLabel(action.getToolTipText());
+					}
+				}
+			};
+			// property listener is removed in
+			// DirectContributionItem#handleWidgetDispose()
+			action.addPropertyChangeListener(propertyListener);
+			toolItem.getTransientData().put(DirectContributionItem.DISPOSABLE, new Runnable() {
+						public void run() {
+							action.removePropertyChangeListener(propertyListener);
+						}
+					});
 			return toolItem;
 		}
 		return null;