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;